我正在尝试从awk中为文件的每一行运行一个shell命令,该shell命令需要一个输入参数。我尝试使用system()
,但无法识别输入参数。
此文件的每一行都是文件的地址,我想运行命令来处理该文件。因此,举一个简单的例子,我想对每行使用'wc'命令并将$1
传递给wc。
awk '{system("wc $1")}' myfile
awk '{system("wc "$1)}' myfile
awk '{
cmd = "your_command " $1
while (cmd | getline line) {
do_something_with(line)
}
close(cmd)
}' file
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作为ENDFILE。对于其他awk,只需将值存储在数组中,然后在END部分中循环打印即可。
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被替换),然后将该命令的结果放入geoip(| getline geoip
位)。接下来,在geoip
变量中打印一些东西。
完整的示例和结果可以在我写的文章here中找到。
awk '{print $1}' myfile | xargs wc
区别在于,它使用多个参数执行一次
wc。它通常可以工作(例如,使用kill命令)