2009-06-02 58 views
1

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

例子:我想从本节开始于行exctract从.tnsnames.ora 主机和端口105

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

回答

1

使用:

sed的“105,$ <无论SED代码你想在这里>”

如果你特别想要的主机,你可以做类似的端口:

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

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

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

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

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

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

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

您可以编写如C AWK代码,但它更简洁地表述为“模式{}行动”对。

如果你有gawknawk,场隔离器是一种ERE作为弘文Saito表示

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