使用awk调用可执行程序

use*_*431 41 shell awk

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

Cal*_*leb 45

从AWK手册页:

system(cmd)
              executes cmd and returns its exit status

GNU AWK 手册还有一个部分,部分描述了该system功能并提供了一个示例:

system("date | mail -s 'awk run done' root")
Run Code Online (Sandbox Code Playgroud)


Bar*_*mar 24

有几种方法.

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

    system("cmd")

  2. 你可以打印到管道:

    print "blah" | "cmd"

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

    awk 'some script' | sh


Ini*_*ian 7

一种更健壮的方法是使用getline()GNU函数awk来使用管道中的变量。以cmd | getline结果形式cmd运行,然后将其输出通过管道传递到getline1如果失败,0则返回是否有输出,如果是EOF,则返回-1

BEGIN如果命令依赖于文件的内容(例如,简单date或),则首先构造要在子句中的变量中运行的命令ls

上面的一个简单示例是

awk 'BEGIN {
    cmd = "ls -lrth"
    while ( ( cmd | getline result ) > 0 ) {
        print result
    }
    close(cmd);
}'
Run Code Online (Sandbox Code Playgroud)

当要运行的命令是文件的列式内容的一部分时,您将cmd在主目录中生成字符串,{..}如下所示。例如,考虑一个文件,$2其中包含文件名,并且您希望将其替换md5sum为文件的哈希内容。你可以做

awk '{ cmd = "md5sum "$2
       while ( ( cmd | getline md5result ) > 0 ) { 
           $2 = md5result
       }
       close(cmd);
 }1'
Run Code Online (Sandbox Code Playgroud)

涉及外部命令的另一种常见用法awk是在date处理过程中,当您awk不支持带有的功能时mktime()strftime()功能。

考虑一种情况,当您将Unix EPOCH时间戳存储在一列中并且想要将其转换为人类可读的日期格式时。假设GNU date可用

awk '{ cmd = "date -d @" $1 " +\"%d-%m-%Y %H:%M:%S\"" 
       while ( ( cmd | getline fmtDate) > 0 ) { 
           $1 = fmtDate
       }
       close(cmd);
}1' 
Run Code Online (Sandbox Code Playgroud)

输入字符串为

1572608319 foo bar zoo
Run Code Online (Sandbox Code Playgroud)

上面的命令产生的输出为

01-11-2019 07:38:39 foo bar zoo
Run Code Online (Sandbox Code Playgroud)

可以定制该命令以修改date给定行中任何列上的字段。请注意,这-d是GNU特定的扩展,* BSD变体支持-f(尽管与并不完全相似-d)。


Ran*_*ngh 5

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

awk 'BEGIN{system("echo hello")}'
Run Code Online (Sandbox Code Playgroud)

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


typ*_*gic 5

我使用 awk 的强大功能来删除一些已停止的 docker 容器。仔细观察我如何cmd在将字符串传递给system.

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

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