调用用awk的可执行程序(Calling an executable program using a

2019-07-19 01:48发布

我有一个在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:

有几种方法。

  1. awk有一个system()将运行一个外壳命令功能:

    system("cmd")

  2. 您可以打印到管道:

    print "blah" | "cmd"

  3. 你可以有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 xargsman 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子句如果命令是依赖于文件的内容,例如一个简单的datels

上述的一个简单的例子是

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'


文章来源: Calling an executable program using awk
标签: shell awk