awk将命令输出保存到变量

时间:2009-12-08 04:14:10

标签: linux scripting awk

我需要在某个文件的每一行执行命令。例如:

file1.txt 100 4
file2.txt 19 8

所以我的awk脚本需要执行类似

的操作
command $1 $2 $3

并保存command $1 $2 $3的输出,因此system()将不起作用,getline也不会。 (如果我做这样的话,我就无法输出输出。)

此问题的限制是仅使用awk。 (我已经有了bashscriot + awk的解决方案......但我只想要awk ......只是为了了解更多信息)

2 个答案:

答案 0 :(得分:2)

使用getline有什么问题?

$ ./test.awk test.txt
# ls -F | grep test
test.awk*
test.txt

# cat test.txt | nl
     1  ls -F | grep test
     2  cat test.txt | nl
     3  cat test.awk

# cat test.awk
#!/usr/bin/awk -f
{
        cmd[NR] = $0
        while ($0 | getline line) output[NR] = output[NR] line RS
}
END {
        for (i in cmd) print "# " cmd[i] ORS output[i]
}

答案 1 :(得分:0)

awk的system()函数将字符串传递给/ bin / sh,因此如果需要,可以使用重定向运算符,例如“> file.out”。

awk '{system("command " $1 " " $2 " " $3 ">" $1 ".out");}'

编辑:好的,通过保存,你的意思是进入一个awk变量。然后,ephemient正在走上正轨。这就是awk的getline所做的事情,比如shell / perl中的反引号或$(cmd)。事实上,google for awk反引号发现了这个: http://www.omnigroup.com/mailman/archive/macosx-admin/2006-May/054665.html

你说你不能使用getline因为那时你无法管道。但你可以使用tee和文件描述符技巧解决这个问题。如果/ bin / sh是bash:

,这是有效的
{ "set +o posix; command " $1 " " $2 " "  $3  " | tee >(grep foo)"  | getline var; print toupper(var); } # bash-only, and broken.

set +o posix是必要的,因为awk将bash作为sh运行,这使得它在读取其启动文件后进入posix模式。嗯,我没有运气好运,而且无论如何都需要bash。

好的,这有效:


    $ touch foo bar
    $ echo "foo bar" | 
      awk '{ "{ ls " $1 " " $2 " "  $3  " | tee /dev/fd/10 | grep foo > /dev/tty; } 10>&1"  | getline var; print toupper(var); }'
    foo
    BAR