98. 双向通信
awk 可以使用 |& 与外部进程通信,这是双向通信。
以下简单的 sed 示例将单词 "Awk" 替换为 "Sed and Awk"。
$ echo "Awk is great" | sed 's/Awk/Sed and Awk/'
Sed and Awk is great
为了了解 Awk 的双向通信如何工作,以下 awk 脚本使用 |& 模拟上述简单示例。
$ cat two-way.awk
BEGIN {
command = "sed 's/Awk/Sed and Awk/'"
print "Awk is Great!" |& command
close(command,"to");
command |& getline tmp
print tmp;
close(command);
}
$ awk -f two-way.awk
Sed and Awk is Great!
在上面的例子中:
command = "sed 's/Awk/Sed and Awk/'"—— 这是我们要与 awk 建立双向通信的命令。 这是一个简单的 sed 替代命令,它将用"Sed and Awk"替换"Awk"。print "Awk is Great!" |& command—— 命令的输入。 即 sed 替代命令的输入是"Awk is Great!"。|&表示这是双向通信。|&右侧命令的输入来自左侧。close(command,"to")—— 一旦执行进程,您应该关闭"to"进程。command |& getline tmp—— 现在该过程已完成,是时候使用getline获取该过程的输出了。 先前执行的命令的输出现在将存储在变量tmp中。print tmp—— 打印输出。close(command)—— 最后,关闭命令。
当您严重依赖外部程序的输出时,双向通信会派上用场。