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

时间:2013-12-17 23:30:49

标签: shell awk parameter-passing

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

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

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

5 个答案:

答案 0 :(得分:56)

你很亲密。你必须将命令行与awk变量连接起来:

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

答案 1 :(得分:39)

您无法获取awk system()电话的输出,您只能获得退出状态。使用getline/pipegetline/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,我写的一篇文章。