2

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

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

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

4 回答 4

2

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

'$0=$2' 总是正确的,所以这个脚本会自动打印 $2。

$ gawk -F'[()]' 'NR>105&&NR<115&&(/host/||/port/)&&$0=$2' .tnsnames.ora
于 2009-06-02T13:25:30.507 回答
1

采用:

sed '105,$< 你想要的任何 sed 代码 >'

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

sed .tnsnames.ora  '105,115p'|grep -e 'host=' -e 'port='
于 2009-06-02T08:11:19.033 回答
1

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

sed -n -e '105,115s/(port=\([0-9].*\))/\1/p' -e '105,115s/(host=\([0-9\.].*\))/\1/p' tnsnames.ora 
于 2009-06-02T09:47:51.600 回答
1

@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
    } 
'
于 2009-06-02T18:02:18.640 回答