Shell/awk 如何将某些值传递给另一个命令的结果

Shell/awk 如何将某些值传递给另一个命令的结果

使用此命令,我使用 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

相关内容