我想system在awk脚本中运行该命令并将其输出存储在变量中.我一直试图这样做,但命令的输出总是进入shell而我无法捕获它.关于如何做到这一点的任何想法?
例:
$ date | awk --field-separator=! {$1 = system("strip $1"); /*more processing*/}
Run Code Online (Sandbox Code Playgroud)
应该调用strip系统命令而不是将输出发送到shell,应该将输出分配回来$1进行更多处理.现在是Rignt,它将输出发送到shell并将命令的retcode分配给$1.
gho*_*g74 56
注意:Coprocess是特定于GNU awk的.无论如何另一种选择是使用getline
cmd = "strip "$1
while ( ( cmd | getline result ) > 0 ) {
print result
}
close(cmd)
Run Code Online (Sandbox Code Playgroud)
fed*_*qui 29
要在中运行系统命令,awk可以使用system()或cmd | getline.
我更喜欢,cmd | getline因为它允许您将值捕获到变量中:
$ awk 'BEGIN {"date" | getline mydate; close("date"); print "returns", mydate}'
returns Thu Jul 28 10:16:55 CEST 2016
Run Code Online (Sandbox Code Playgroud)
更一般地说,您可以将命令设置为变量:
awk 'BEGIN {
cmd = "date -j -f %s"
cmd | getline mydate
close(cmd)
}'
Run Code Online (Sandbox Code Playgroud)
请注意,close()如果您有多个结果,请务必使用以防止出现"制作太多打开文件"错误(感谢mateuscb在评论中指出这一点).
使用时system(),命令输出会自动打印,您可以捕获的值是其返回码:
$ awk 'BEGIN {d=system("date"); print "returns", d}'
Thu Jul 28 10:16:12 CEST 2016
returns 0
$ awk 'BEGIN {d=system("ls -l asdfasdfasd"); print "returns", d}'
ls: cannot access asdfasdfasd: No such file or directory
returns 2
Run Code Online (Sandbox Code Playgroud)
Sah*_*has 28
想通了.
我们使用awk的双向I/O.
{
"strip $1" |& getline $1
}
Run Code Online (Sandbox Code Playgroud)
将$ 1传递给strip,getline将条带的输出返回到$ 1
小智 6
gawk '{dt=substr($4,2,11); gsub(/\//," ",dt); "date -d \""dt"\" +%s"|getline ts; print ts}'
Run Code Online (Sandbox Code Playgroud)
当您需要处理 grep 输出时,可以使用它:
echo "some/path/exex.c:some text" | awk -F: '{ "basename "$1"" |& getline $1; print $1 " ==> " $2}'
Run Code Online (Sandbox Code Playgroud)
选项-F:告诉 awk 用作:字段分隔符
"basename "$1""basename在第一个字段上执行 shell 命令
|& getline $1读取子流中前一个 shell 命令的输出
output:
exex.c ==> some text
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
75451 次 |
| 最近记录: |