我正在尝试根据 IP 的前三个八位字节从命名文件中获取 awk 信息。在此文件中,IP 可以位于第 2 列或第 4 列中。如果 IP 位于第 2 列中,我想打印第 2 列中的内容,然后打印第 1 列中的内容。如果 IP 位于第 4 列中,我会打印例如打印第 4 列和第 1 列。(服务器名称中的第 1 列)。
这是打印所有列的输出示例:
awk /10.1.49/ /var/named/internal/Domain/abc.com
输出如下所示:
server01 IN A 10.1.49.29
server02 IN A 10.1.49.80
;globalname01.abc.com 10.1.49.60
;globalname02.abc.com 10.1.49.61
我想按 IP 列排序,然后打印 IP 和服务器名称:
10.1.49.20 server01
10.1.49.60 globalname01.abc.com
10.1.49.61 globalname02.abc.com
10.1.49.80 server02
我确实知道如何使用{print NF}
来获取列数,我只是不知道如何使用该信息,例如如果 NF 返回 4 那么{print $4 $1}
但是如果 NF 返回 2 那么{print $2 $1}
...并且最好在其之上排序(但我可以将该数据扔到一个文件中,然后再次读回以对其进行排序(如果需要)。
答案1
尝试:
$ awk '$NF~/^10\.1\.49/ {sub(/;/, "", $1); print $NF,$1}' file | sort
10.1.49.29 server01
10.1.49.60 globalname01.abc.com
10.1.49.61 globalname02.abc.com
10.1.49.80 server02
怎么运行的
$NF~/^10\.1\.49/ {..}
这将选择最后一列以 开头的行
10.1.49
。对于这些行,执行大括号中的命令。sub(/;/, "", $1)
大括号中的第一个命令是替代命令。
;
如果存在,它将从第一个字段中删除。print $NF,$1
这将打印最后一个字段,然后打印(可能已修改的)第一个字段。
sort
这对输出进行排序。请注意,有多种可能的方法可以对 IP 地址进行排序,并且排序的许多选项可以帮助您获得所需的输出。
答案2
awk '{ if ($1 ~ /;.*/) { print $2, substr($1, 2); } else { print $4, $1; } }' file | sort
输出:
10.1.49.29 server01
10.1.49.60 globalname01.abc.com
10.1.49.61 globalname02.abc.com
10.1.49.80 server02