首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用awk调用可执行程序

使用awk调用可执行程序
EN

Stack Overflow用户
提问于 2013-02-01 04:15:54
回答 7查看 130.4K关注 0票数 62

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

EN

回答 7

Stack Overflow用户

发布于 2013-02-01 04:22:54

有几种方法。

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

system("cmd")

  • You可以打印到管道:

print "blah" | "cmd"

  • You可以使用awk构造命令,并通过管道将所有输出发送到外壳:

awk 'some script' | sh

票数 32
EN

Stack Overflow用户

发布于 2019-03-21 18:54:23

一种更健壮的方法是使用GNU awkgetline()函数来使用管道中的变量。在表单cmd | getline结果中,运行cmd,然后将其输出通过管道传输到getline。如果获得输出,则返回1;如果获得EOF,则返回0;如果失败,则返回-1

如果命令不依赖于文件的内容,则首先构造在BEGIN子句的变量中运行的命令,例如简单的datels

上面的一个简单的例子是

代码语言:javascript
复制
awk 'BEGIN {
    cmd = "ls -lrth"
    while ( ( cmd | getline result ) > 0 ) {
        print result
    }
    close(cmd);
}'

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

代码语言:javascript
复制
awk '{ cmd = "md5sum "$2
       while ( ( cmd | getline md5result ) > 0 ) { 
           $2 = md5result
       }
       close(cmd);
 }1'

awk中涉及外部命令的另一个常见用法是在date处理期间,当您的awk不支持开箱即用的时间函数和mktime()strftime()函数时。

考虑这样一种情况:您将Unix纪元时间戳存储在列中,并且希望将其转换为人类可读的日期格式。假设GNU date可用

代码语言:javascript
复制
awk '{ cmd = "date -d @" $1 " +\"%d-%m-%Y %H:%M:%S\"" 
       while ( ( cmd | getline fmtDate) > 0 ) { 
           $1 = fmtDate
       }
       close(cmd);
}1' 

对于输入字符串,如

代码语言:javascript
复制
1572608319 foo bar zoo

上面的命令会产生如下输出

代码语言:javascript
复制
01-11-2019 07:38:39 foo bar zoo

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

有关getline的更多信息,请参阅awk.freeshell.org页面上的这篇AllAboutGetline文章。

票数 32
EN

Stack Overflow用户

发布于 2013-02-01 09:32:50

像这样简单的事情就行了。

代码语言:javascript
复制
awk 'BEGIN{system("echo hello")}'

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14634349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档