我如何将变量从awk传递给shell命令?

问题描述 投票:49回答:5

我正在尝试从awk中为文件的每一行运行一个shell命令,该shell命令需要一个输入参数。我尝试使用system(),但无法识别输入参数。

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

awk '{system("wc $1")}' myfile
shell awk parameter-passing
5个回答
63
投票
awk '{system("wc "$1)}' myfile

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

2
投票
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部分中循环打印即可。


0
投票
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中找到。

0
投票
awk '{print $1}' myfile | xargs wc

区别在于,它使用多个参数执行一次

wc。它通常可以工作(例如,使用

kill命令)

© www.soinside.com 2019 - 2024. All rights reserved.