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)
—— 最后,关闭命令。
当您严重依赖外部程序的输出时,双向通信会派上用场。