Linux awk save命令输出到变量
我需要在某个文件的每行执行一个命令。例如:Linux awk save命令输出到变量,linux,scripting,awk,Linux,Scripting,Awk,我需要在某个文件的每行执行一个命令。例如: file1.txt 100 4 file2.txt 19 8 因此,我的awk脚本需要执行以下操作 command $1 $2 $3 并保存命令$1$2$3的输出,这样system()将不起作用,getline。(如果我这样做的话,我就无法通过管道输出。) 此问题的限制是仅使用awk。(我已经有了bashscriot+awk的解决方案…但我只想让awk…只是想了解更多这方面的信息)使用getline有什么问题 $ ./test.awk test.t
file1.txt 100 4
file2.txt 19 8
因此,我的awk
脚本需要执行以下操作
command $1 $2 $3
并保存命令$1$2$3的输出
,这样system()
将不起作用,getline
。(如果我这样做的话,我就无法通过管道输出。)
此问题的限制是仅使用
awk
。(我已经有了bashscriot+awk的解决方案…但我只想让awk…只是想了解更多这方面的信息)使用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]
}
$./test.awk test.txt
#ls-F | grep检验
test.awk*
test.txt
#cat test.txt | nl
1 ls-F | grep测试
2 cat test.txt | nl
3 cat test.awk
#cat test.awk
#!/usr/bin/awk-f
{
cmd[NR]=$0
而($0 | getline line)输出[NR]=输出[NR]行RS
}
结束{
对于(i in cmd)打印“#”cmd[i]或输出[i]
}
Awk的system()函数将字符串传递给/bin/sh,因此如果需要,可以使用重定向操作符,如“>file.out”
awk '{system("command " $1 " " $2 " " $3 ">" $1 ".out");}'
编辑:好的,通过保存,您的意思是进入一个awk变量。那么,ephemient在正确的轨道上。这就是awk的getline所做的,比如shell/perl中的backticks或$(cmd)。事实上,google for awk backticks发现:
您说您不能使用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以sh
的形式运行bash,这使得它在读取启动文件后进入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
我的实际解决方案是这样做,但我无法将命令的输出发送到变量。您可以通过后续的readline[…]<$1.out“
循环将输出回。别忘了自己清理一下……我同时使用了一些文件描述符重定向到pipe和getline。这就是你需要的吗?这是bash脚本。当我使用getline时,我无法使用管道命令,例如cat file | process parameters,我只获取cat文件。我这样做是为了用更干净的方式来完成这项任务…最后10行回答了我的问题嗯,我认为这显然是脚本本身运行的演示,但可能不是。