【问题标题】:Perform action on line range in sed/awk在 sed/awk 中对行范围执行操作
【发布时间】:2010-10-30 14:50:07
【问题描述】:

如何从 sed/awk 中特定范围的行中提取某些变量?

示例:我想从 .tnsnames.ora 中提取主机和端口 从第 105 行开始的这一部分开始。

DB_CONNECTION=
   (description=
     (address=
         (protocol=tcp)
         (host=127.0.0.1)
         (port=1234)
      )
      (connect_data=
         (sid=ABCD)
         (sdu=4321)
  )

【问题讨论】:

    标签: sed awk


    【解决方案1】:

    gawk 可以在字段分隔符(FS)中使用正则表达式。

    '$0=$2' 始终为真,因此此脚本会自动打印 $2。

    $ gawk -F'[()]' 'NR>105&&NR<115&&(/host/||/port/)&&$0=$2' .tnsnames.ora
    

    【讨论】:

      【解决方案2】:

      使用:

      sed '105,$'

      如果您特别想要主机和端口,您可以执行以下操作:

      sed .tnsnames.ora  '105,115p'|grep -e 'host=' -e 'port='
      

      【讨论】:

        【解决方案3】:

        您可以使用地址范围来指定应用正则表达式的部分。如果您留下结束行地址(保留逗号),它将与文件末尾匹配。您还可以通过多次使用“-e”来“链接”多个表达式。以下表达式只会将端口和主机值打印到标准输出。它使用反向引用 (\1) 来打印匹配的部分。

        sed -n -e '105,115s/(port=\([0-9].*\))/\1/p' -e '105,115s/(host=\([0-9\.].*\))/\1/p' tnsnames.ora 
        

        【讨论】:

          【解决方案4】:

          @lk,解决您发布的答案:

          您可以像 C 一样编写 awk 代码,但它更简洁地表示为“模式 {action}”对。

          如果您有gawknawk,则字段分隔符是ERE,正如Hirofumi Saito 所说

          gawk -F'[()=]' '
              NR < 105 {next}
              NR > 115 {exit}
              $2 == "host" || $2 == "port" {
                  # do stuff with $2 and $3
                  print $2 "=" $3
              } 
          '
          

          【讨论】:

            猜你喜欢
            • 2011-09-10
            • 1970-01-01
            • 2015-09-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-08
            相关资源
            最近更新 更多