题 使用awk调用可执行程序


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


29
2018-01-31 20:15


起源


一个已编译的c程序只是一个程序......就像运行任何命令行操作一样运行它... - PearsonArtPhoto
你可以打电话 system() 用awk来执行命令。也许您可以进一步解释您的需求,因为有更好的方法可以在90%以上的时间内完成此操作。 - Grambot
这通常是错误的做法。如果你发布一个小的awk脚本并解释你何时想要调用你的C程序,我们可以告诉你如何做或者更好的方法。 - Ed Morton


答案:


从AWK手册页:

系统(CMD)
              执行cmd并返回其退出状态

GNU AWK 手册 也有 一节 在某种程度上,描述了 system 功能并提供一个例子:

system("date | mail -s 'awk run done' root")

36
2018-01-31 20:19



感谢您的帮助!我在busybox中有一个shell命令:logread -f | awk {if .....}和awk里面我想在if语句中使用参数为true时调用我的程序。你能给我一个暗示吗? - user2030431
尝试 logread -f | awk '{ if(condition01){system("yourCprogram arguments")} }' - nullrevolution
@ user2030431如果你想用这些/更多细节更新你的问题,你会对读者好。是的,我知道它有点晚了:) - Felix


有几种方法。

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

    system("cmd")

  2. 你可以打印到管道:

    print "blah" | "cmd"

  3. 您可以拥有awk构造命令,并将所有输出传递给shell:

    awk 'some script' | sh


20
2018-01-31 20:22





像这样简单的东西将起作用

awk 'BEGIN{system("echo hello")}'

awk 'BEGIN { system("date"); close("date")}'


4
2018-02-01 01:32





#!/usr/bin/awk -f

BEGIN {
    command = "ls -lh"

    command |getline
}

在awk脚本中运行“ls -lh”


3
2018-06-16 08:19



你确定这个有效吗?这不起作用。 - Chan Kim


这真的取决于:)方便的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 是一个更好,更便携的选择,正如评论所指出的那样(可以找到与讨论的良好联系)。


2
2018-04-30 16:31



这对我来说不正常...... - MountainX
@MountainX以哪种方式工作(错误)?您使用哪种操作系统和Shell? - Felix
在Arch Linux和bash中,这是我的结果:[user @ comp1~] $ echo“1 2 \ n3 4”| awk'{print $ 2}'| xargs touch [user @ comp1~] $ ls -la -rw-rw ---- 1位用户0 Mar 7 13:34 2n3 - MountainX
问题可能是这里讨论的问题: stackoverflow.com/questions/8467424/...。以下适用于我:printf“1 2 \ n3 4”| awk'{print $ 2}'| xargs触摸 - MountainX
很好的选择和感谢反馈。将更新示例。 - Felix


我使用awk的强大功能删除了一些已停止的docker容器。仔细观察我是如何构建的 cmd 在传递给它之前先串起来 system

docker ps -a | awk '$3 ~ "/bin/clish" { cmd="docker rm "$1;system(cmd)}'

在这里,我使用具有模式“/ bin / clish”的第3列,然后我在第一列中提取容器ID以构建我的 cmd 字符串并将其传递给 system


0
2018-01-10 07:31





我能够通过以下方法完成此操作

cat ../logs/em2.log.1 |grep -i 192.168.21.15 |awk '{system(`date`); print $1}'

awk有一个叫做system的函数,它可以让你在awk的输出中执行任何linux bash命令。


0
2018-01-15 11:35