awk 通过 shell cmd 的管道输入和输出

awk 通过 shell cmd 的管道输入和输出

我想在 awk 中运行 shell 命令。 Shell 命令通常采用 stdin 并写入 stdout。

print to_sort | "sort"
"sort" | getline

不起作用(在第二行排序等待输入)

print to_sort | "sort" | getline

是一个语法错误。

答案1

GNU awk 知道协进程可以做到这一点。它的手册还描述了为什么您正在做的事情不起作用:管道中使用的两个命令是不同的子进程,即使它们是使用相同的命令行启动的。要从同一子进程获取输入和输出,请|&在两个管道上使用:

awk 'BEGIN {com = "cat -n"} {print |& com; com |& getline; print}'

但这并不能真正帮助你sort,因为sort不会产生任何输出,直到在输入中看到 EOF。

对于这样的命令,您需要首先给出所有输出,关闭协进程管道的写入端,然后才开始从中读取。例如

awk 'BEGIN {com="sort"} {print |& com} END { print "---"; close(com, "to"); while(com |& getline) print }'

相关内容