使用此命令,我使用 AWK 命令从 apache 访问日志中获取顶级 ip 列表,因为它处理第一个输入变量($1),即 ip。(然后它执行一些操作,例如排序、计数等,但现在这些都不重要)输出只是一些 ip 列表:
cat /var/log/apache2/access.log | awk '{print $1}' | sort -n | uniq -c | sort -nr | head -20
输出是 IP 列表。
使用此命令,我可以获取每个顶级 IP 的主机名:
cat /var/log/apache2/access.log | awk '{print $1}' | sort -n | uniq -c | sort -nr | head -20 | awk '{print "host "$2"" | "/bin/sh"}' | awk '{print $5}'
输出是主机名列表。
但问题是,我如何将 ip 传递给最后一个 '{print $5}' 部分的输出?这样我就会有 ip 和主机名的列表?而不是两个不同的输出/文件。
答案1
一般来说,你可以使用以下方法做这种事情xargs
,例如
awk '{print $1}' apache.log | sort -n | uniq -c | sort -nr | head -20 |
xargs -L1 sh -c 'host "$2" | awk -v ip="$2" "{print ip, \$5}"' sh
如果你有 GNU awk(又名gawk
),那么你可以在内部进行排序,并将 IP 传递给host
命令使用管道中的 getline
前任。
gawk -v cmd='host ' '
{c[$1]++}
END{
PROCINFO["sorted_in"] = "@val_num_desc"
for(i in c) {
if(++n > 20) break
cmd i | getline; close(cmd i)
print i, $5
}
}
' apache.log