我有这个命令输出由⎟
分隔的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
谢谢
答案 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
输出部分。