awk 当字符串可以位于不同列时

awk 当字符串可以位于不同列时

我正在尝试根据 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

相关内容