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

在sed/awk中对线路范围执行操作,sed,awk,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)

如何从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'105,$<此处需要的任何sed代码>'

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

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

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

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

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

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

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

$gawk-F'[()]''NR>105&&NR@lk,请回答您发布的答案:

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

如果你有或,字段分隔符是一个广文斋藤说

gawk -F'[()=]' '
    NR < 105 {next}
    NR > 115 {exit}
    $2 == "host" || $2 == "port" {
        # do stuff with $2 and $3
        print $2 "=" $3
    } 
'
gawk-F'[()=]
NR<105{next}
NR>115{exit}
$2==“主机”| |$2==“端口”{
#用2美元和3美元做事
打印$2“=”$3
} 
'