我怎样才能将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
位)中。 接下来,在geoip
variables里面打印一些东西。
完整的例子和结果可以在这里find,我写的一篇文章。