我有一个在C程序,我想通过shell脚本用awk调用。 我怎么能这样做?
Answer 1:
从AWK手册页:
system(cmd) executes cmd and returns its exit status
在GNU AWK 手册也有一个部分 ,在部分地描述了system
的功能和提供了一个示例:
system("date | mail -s 'awk run done' root")
Answer 2:
有几种方法。
awk有一个
system()
将运行一个外壳命令功能:system("cmd")
您可以打印到管道:
print "blah" | "cmd"
你可以有AWK构建命令,管所有的输出到shell:
awk 'some script' | sh
Answer 3:
事情就这么简单,这将工作
awk 'BEGIN{system("echo hello")}'
和
awk 'BEGIN { system("date"); close("date")}'
Answer 4:
#!/usr/bin/awk -f
BEGIN {
command = "ls -lh"
command |getline
}
运行在awk脚本的“ls -lh”
Answer 5:
这真的取决于:)一个得心应手的Linux核心utils的(的info coreutils
)是xargs
。 如果你是使用awk
,你可能已经有了一个更复杂的使用情况-你的问题是不是非常的相关详细。
printf "1 2\n3 4" | awk '{ print $2 }' | xargs touch
将执行touch 2 4
。 这里touch
可以通过程序来代替。 在更多信息info xargs
和man xargs
(真的, 阅读这些 )。 我相信你想更换touch
与您的程序。
beforementioned脚本的明细 :
printf "1 2\n3 4"
# Output:
1 2
3 4
# The pipe (|) makes the output of the left command the input of
# the right command (simplified)
printf "1 2\n3 4" | awk '{ print $2 }'
# Output (of the awk command):
2
4
# xargs will execute a command with arguments. The arguments
# are made up taking the input to xargs (in this case the output
# of the awk command, which is "2 4".
printf "1 2\n3 4" | awk '{ print $2 }' | xargs touch
# No output, but executes: `touch 2 4` which will create (or update
# timestamp if the files already exist) files with the name "2" and "4"
更新在原来的答案,我用echo
,而不是printf
。 然而, printf
是被评论(其中有很大的讨论链接可以找到)指出,更好,更便携的选择。
Answer 6:
我用awk的力量来删除一些我停泊坞窗容器。 仔细观察我是如何构建cmd
它传递给前第一串system
。
docker ps -a | awk '$3 ~ "/bin/clish" { cmd="docker rm "$1;system(cmd)}'
在这里,我使用具有图案“/斌/ clish”第3列,然后我提取容器ID在第一列中,构建我的cmd
字符串,然后传递给该system
。
Answer 7:
我能有这个通过以下方法来完成
cat ../logs/em2.log.1 |grep -i 192.168.21.15 |awk '{system(`date`); print $1}'
awk有一个调用的系统功能它使您能够AWK的输出中执行任何Linux bash命令。
Answer 8:
一个更可靠的方法将是使用的getline()
GNU的函数awk
使用可变从管道。 在形式cmd | getline
cmd | getline
结果, cmd
被运行,那么其输出被管道输送到getline
。 它返回1
,如果有输出, 0
如果EOF, -1
失败。
第一构造命令在以可变运行BEGIN
子句如果命令是不依赖于文件的内容,例如一个简单的date
或ls
。
上述的一个简单的例子是
awk 'BEGIN {
cmd = "ls -lrth"
while ( ( cmd | getline result ) > 0 ) {
print result
}
close(cmd);
}'
当运行该命令是文件的柱状内容的一部分,您生成cmd
在主串{..}
如下。 如考虑其文件$2
中包含的文件的名字,你希望它与被替换md5sum
文件的哈希值的内容。 你可以做
awk '{ cmd = "md5sum "$2
while ( ( cmd | getline md5result ) > 0 ) {
$2 = md5result
}
close(cmd);
}1'