我怎样才能将variables从awk传递给shell命令?

我试图从一个文件的每一行awk内运行一个shell命令,并且shell命令需要一个input参数。 我尝试使用system() ,但它不能识别input参数。

这个文件的每一行都是一个文件的地址,我想运行一个命令来处理这个文件。 所以,对于一个简单的例子,我想对每一行使用'wc'命令并将$1传递给wc。

 awk '{system("wc $1")}' myfile 

你很近。 你必须连接命令行与awkvariables:

 awk '{system("wc "$1)}' myfile 

你不能抓取awk system()调用的输出,只能得到退出状态。 使用getline / pipe或getline / variable / pipe结构

 awk '{ cmd = "your_command " $1 while (cmd | getline line) { do_something_with(line) } close(cmd) }' file 

仅供参考以下是如何使用awk来处理名称存储在文件中的文件(在本例中提供类似于wc的function):

 gawk ' NR==FNR { ARGV[ARGC++]=$0; next } { nW+=NF; nC+=(length($0) + 1) } ENDFILE { print FILENAME, FNR, nW, nC; nW=nC=0 } ' file 

以上使用GNU awk for ENDFILE。 使用其他awk将值存储在一个数组中,并在END部分循环打印。

或使用pipe道| 就像在bash中一样,然后用awk的getline检索一个variables的输出,像这样

  zcat /var/log/fail2ban.log* | gawk '/.*Ban.*/ {print $7};' | sort | uniq -c | sort | gawk '{ "geoiplookup " $2 "| cut -f2 -d: " | getline geoip; print $2 "\t\t" $1 " " geoip}' 

该行将使用geoip-bin软件包从您的服务器及其来源(国家/地区)打印所有禁用的IP。

单线的最后一部分是影响我们的那一部分:

 gawk '{ "geoiplookup " $2 "| cut -f2 -d: " | getline geoip; print $2 "\t\t" $1 " " geoip}' 

它只是说:运行命令"geoiplookup 182.193.192.4 | -f2 -d:" (您可能会猜到$ 2被replace)并将该命令的结果放在geoip( | getline geoip位)中。 接下来,在geoipvariables里面打印一些东西。

完整的例子和结果可以在这里find,我写的一篇文章。