在sed / awk中对行范围执行操作

时间:2009-06-02 07:54:28

标签: sed awk

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

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

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

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

使用:

sed'105,$&lt;你想要的任何sed代码&gt;'

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

@lk,来解决你发布的答案:

您可以编写类似C的awk代码,但它更简洁地表达为“pattern {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
    } 
'