我正在尝试从awk中为文件的每一行运行一个shell命令,而shell命令需要一个输入参数。我尝试使用system()
,但它无法识别输入参数。
此文件的每一行都是文件的地址,我想运行一个命令来处理该文件。因此,对于一个简单的例子,我想对每一行使用'wc'命令并将$1
传递给wc。
awk '{system("wc $1")}' myfile
答案 0 :(得分:56)
awk '{system("wc "$1)}' myfile
答案 1 :(得分:39)
您无法获取awk system()
电话的输出,您只能获得退出状态。使用getline/pipe或getline/variable/pipe结构
awk '{
cmd = "your_command " $1
while (cmd | getline line) {
do_something_with(line)
}
close(cmd)
}' file
答案 2 :(得分:2)
仅供参考这里是如何使用awk处理其名称存储在文件中的文件(在此示例中提供类似wc的功能):
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。使用其他awks只需将值存储在数组中,然后在END部分的循环中打印。
答案 3 :(得分:1)
我建议另一种解决方案:
awk '{print $1}' myfile | xargs wc
区别在于它使用多个参数执行一次 wc 。它通常可以工作(例如,使用 kill 命令)
答案 4 :(得分:0)
或者像在bash中一样使用管道|
然后使用awk getline
在变量中检索输出,就像这样
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,我写的一篇文章。