我在C中有一个程序,我想在shell脚本中使用awk来调用它。我怎么能这样做?
答案 0 :(得分:41)
来自AWK手册页:
system(cmd) executes cmd and returns its exit status
GNU AWK manual也有a section,部分地描述了system
函数并提供了一个示例:
system("date | mail -s 'awk run done' root")
答案 1 :(得分:23)
有几种方法。
awk有一个system()
函数,它将运行一个shell命令:
system("cmd")
您可以打印到管道:
print "blah" | "cmd"
您可以拥有awk构造命令,并将所有输出传递给shell:
awk 'some script' | sh
答案 2 :(得分:5)
像这样简单的东西将起作用
awk 'BEGIN{system("echo hello")}'
和
awk 'BEGIN { system("date"); close("date")}'
答案 3 :(得分:3)
这真的取决于:)一个方便的linux核心工具(info coreutils
)是xargs
。如果您使用的是awk
,那么您可能会考虑更多涉及的用例 - 您的问题并不是非常详细。
printf "1 2\n3 4" | awk '{ print $2 }' | xargs touch
将执行touch 2 4
。此处touch
可以由您的程序替换。有关info xargs
和man xargs
的更多信息(实际上,阅读这些)。
我相信你想用你的程序替换touch
。
细分:
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
是更好,更便携的选择,正如评论所指出的那样(可以找到与讨论有很好的联系)。
答案 4 :(得分:3)
#!/usr/bin/awk -f
BEGIN {
command = "ls -lh"
command |getline
}
运行" ls -lh"在awk脚本中
答案 5 :(得分:1)
更健壮的方法是使用GNU getline()
的{{1}}函数来使用管道中的变量。在awk
格式的结果中,运行cmd | getline
,然后将其输出通过管道传输到cmd
。如果有输出,则返回getline
;如果有EOF,则返回1
;如果失败,则返回0
。
如果命令不是 依赖于文件的内容,例如,首先构造命令以在-1
子句中的变量中运行。简单的BEGIN
或date
。
上面的一个简单例子是
ls
当运行的命令是文件的列内容的一部分时,您将在主awk 'BEGIN {
cmd = "ls -lrth"
while ( ( cmd | getline result ) > 0 ) {
print result
}
close(cmd);
}'
中生成cmd
字符串,如下所示。例如。考虑一个文件,其中{..}
包含文件名,并且您希望将其替换为文件的$2
哈希值。你可以做
md5sum
答案 6 :(得分:0)
我使用awk的强大功能删除了一些已停止的docker容器。在将cmd
字符串传递给system
之前,请仔细观察我是如何构造docker ps -a | awk '$3 ~ "/bin/clish" { cmd="docker rm "$1;system(cmd)}'
字符串的。
cmd
在这里,我使用具有模式“/ bin / clish”的第3列,然后在第一列中提取容器ID以构造我的system
字符串并将其传递给ara[i].Click += Form1_Click;
syc = syc + 5;
。
答案 7 :(得分:0)
我可以通过以下方法完成此操作
cat ../logs/em2.log.1 |grep -i 192.168.21.15 |awk '{system(`date`); print $1}'
awk有一个叫做system的函数,它可以让你在awk的输出中执行任何linux bash命令。