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

Linux 使用awk中的参数调用bash内置函数,linux,bash,shell,awk,Linux,Bash,Shell,Awk,我有一个命令,它输出两列,以⎟。第一列是出现的次数,第二列是IP地址。整个事情都是按事件发生的升序排序的 awk'{ips[$1]+}END{for(ips中的ip){printf“%5s%-1s%-3s\n”,ips[ip],”⎟", ip}'${ACCESSLOG}“| sort-nk1 十九,⎟ 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.24

我有一个命令,它输出两列,以
。第一列是出现的次数,第二列是IP地址。整个事情都是按事件发生的升序排序的

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

十九,⎟ 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域名指针池-72-80-99-43.nycmny.fios.verizon.net.

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

因此,我的最终命令如下所示:

awk'{ips[$1]+}END{for(ips中的ip){printf”%5s%-1s%-3s%20s\n“,ips[ip],”⎟“,ip,系统(“主机”ip)}'${ACCESSLOG}”| sort-nk1

感谢您不要使用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
awk'{ips[$1]+}
结束{
用于(ip中的ip){
cmd=“主机”ip

如果((cmd | getline host)您实际上没有添加一个问题。这是“如何在awk中获得shell命令的输出?”吗?不要重新发明轮子,这就是日志解析程序的用途,它们针对这一特定任务进行了优化。对于每个IP,日志解析程序将比运行
host
要快得多,但速度仍然很慢(这就是DNS的本质)。但是,请注意,无论您如何操作DNS服务器,都会给您的DNS服务器带来很大的压力,因此在定期执行此操作之前,最好先与您的系统管理员联系。不过,这是一个很好的机会,可以加深对服务器上日常使用的工具(如awk)的了解。@SatoKatsura另外,您是否可以提供一些有关这些日志资源的详细信息你说的LVER?它们是内置函数还是基于库?我应该下载它们吗?它们是开源的,这样我就可以检查代码了吗?谷歌搜索“httpd日志解析器”。它们大多数都不是特定于
httpd
,只要要处理的文件中的每一行都以IP地址开头,它们就可以解析日志(后面是空白).Apache附带了一个名为
logresolve
的实用程序,它可以做到这一点。哇。返回结果大约需要40秒。我认为它正在暂停…但它可以工作。我们确定
host
命令只在IP被唯一化后查询IP,而不是查询92次记录了92次的IP吗?