使用awk调用可执行程序

时间:2013-01-31 20:15:54

标签: shell awk

我在C中有一个程序,我想在shell脚本中使用awk来调用它。我怎么能这样做?

8 个答案:

答案 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)

有几种方法。

  1. awk有一个system()函数,它将运行一个shell命令:

    system("cmd")

  2. 您可以打印到管道:

    print "blah" | "cmd"

  3. 您可以拥有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 xargsman 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子句中的变量中运行。简单的BEGINdate

上面的一个简单例子是

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命令。