我有一个用C编写的程序,我想在shell脚本中使用awk来调用它。我怎么能做这样的事情呢?
发布于 2013-02-01 04:22:54
有几种方法。
system()函数:system("cmd")
print "blah" | "cmd"
awk 'some script' | sh
发布于 2019-03-21 18:54:23
一种更健壮的方法是使用GNU awk的getline()函数来使用管道中的变量。在表单cmd | getline结果中,运行cmd,然后将其输出通过管道传输到getline。如果获得输出,则返回1;如果获得EOF,则返回0;如果失败,则返回-1。
如果命令不依赖于文件的内容,则首先构造在BEGIN子句的变量中运行的命令,例如简单的date或ls。
上面的一个简单的例子是
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'在awk中涉及外部命令的另一个常见用法是在date处理期间,当您的awk不支持开箱即用的时间函数和mktime()、strftime()函数时。
考虑这样一种情况:您将Unix纪元时间戳存储在列中,并且希望将其转换为人类可读的日期格式。假设GNU date可用
awk '{ cmd = "date -d @" $1 " +\"%d-%m-%Y %H:%M:%S\""
while ( ( cmd | getline fmtDate) > 0 ) {
$1 = fmtDate
}
close(cmd);
}1' 对于输入字符串,如
1572608319 foo bar zoo上面的命令会产生如下输出
01-11-2019 07:38:39 foo bar zoo可以对该命令进行定制,以修改给定行中任何列的date字段。请注意,-d是一个特定于GNU的扩展,*BSD变体支持-f (尽管与-d不完全相似)。
有关getline的更多信息,请参阅awk.freeshell.org页面上的这篇AllAboutGetline文章。
发布于 2013-02-01 09:32:50
像这样简单的事情就行了。
awk 'BEGIN{system("echo hello")}'和
awk 'BEGIN { system("date"); close("date")}'
https://stackoverflow.com/questions/14634349
复制相似问题