awk一次处理多个排序

时间:2017-05-25 14:27:00

标签: awk

我只想删除"[]""out:"&来自输出的nameserver,因为我首先得到文件中有nameserver的行。

然后我再次使用awk处理并删除提到的值,我相信没有两次调用awk会有聪明的方法来做到这一点。

$ awk '/nameserver/'  dns_file
[keanx61.ddl.COM]            out:  nameserver  192.22.48.33
[keanx61.ddl.COM]            out:  nameserver  192.22.48.23
[keanx61.ddl.COM]            out:  nameserver  172.144.71.11

$ awk '!/^$/ { gsub( /[][]|out:|nameserver/ , "" ); print $0 }' dns_file
keanx61.ddl.COM  192.22.48.33
keanx61.ddl.COM  192.22.48.23
keanx61.ddl.COM  172.144.71.11

1 个答案:

答案 0 :(得分:2)

awk -F'[][]| +' '/nameserver/ { print $2, $NF }'

-F选项设置输入字段分隔符,在这种情况下是一个正则表达式(用单引号保持shell不搞乱):'[][]'匹配[],而' +'(这是一个后跟加号的空格;空间在这里很重要!)匹配一个或多个空格。将它们与交替(“或”)运算符|放在一起以获得'[][]| +'会产生一个正则表达式,该表达式匹配单个方括号或任意数量的空格。

每次解析器找到字段分隔符的匹配项时,它都会启动一个新字段,因此您的名称服务器行将拆分为以下字段:

 [keanx61.ddl.COM]            out:  nameserver  192.22.48.33
^field 1 (empty)
  ^field 2 
                  ^field 3 (empty)
                              ^field 4
                                     ^field 5   ^field 6

因此,在该特定行中,$1""$2"keanx61.ddl.COM"$3""$4"out:"$5"nameserver"$6"192.22.48.33"

我们只关心主机名($2)和IP地址;由于IP地址是最后一个字段,我们实际上不必计算过去2.我们可以只询问“最后一个字段”,$NF