使用awk中的参数调用bash内置函数

时间:2015-07-21 22:59:18

标签: linux bash shell awk

我有这个命令输出由分隔的2列。第一列是出现次数,第二列是IP地址。整个事情按升序#排序。

awk '{ips[$1]++} END {for (ip in ips) { printf "%5s %-1s %-3s\n", ips[ip], "⎟", ip}}' "${ACCESSLOG}" | sort -nk1

19⎟76.20.221.34
19⎟76.9.214.2
22⎟105.152.107.118
26⎟24.185.179.32
26⎟42.117.198.229
26⎟83.216.242.69

现在我想在那里添加第三列。在bash shell中,例如:

host 72.80.99.43

你会得到:

43.99.80.72.in-addr.arpa domain name pointer pool-72-80-99-43.nycmny.fios.verizon.net.

因此,对于列表中出现的每个IP,我想在第三列中显示其关联的主机。我想在awk内做到这一点。所以从awk调用host并传递参数ip。理想情况下,跳过所有标准内容并仅显示主机名,如下所示:nycmny.fios.verizon.net.

所以我的最终命令看起来像这样:

awk '{ips[$1]++} END {for (ip in ips) { printf "%5s %-1s %-3s %20s\n", ips[ip], "⎟", ip, system( "host " ip )}}' "${ACCESSLOG}" | sort -nk1

谢谢

1 个答案:

答案 0 :(得分:2)

您不会使用system(),因为您想要将shell命令输出与awk输出结合起来,您将该命令作为字符串调用并将其结果读入变量getline,例如:

awk '{ips[$1]++}
END {
    for (ip in ips) {
        cmd = "host " ip
        if ( (cmd | getline host) <= 0 ) {
            host = "N/A"
        }
        close(cmd)
        printf "%5s %-1s %-3s %20s\n", ips[ip], "⎟", ip, host
    }
}' "${ACCESSLOG}" | sort -nk1

我假设您可以弄清楚如何使用*sub()来获取您关心的host输出部分。