• 本页内容

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) —— 最后,关闭命令。

当您严重依赖外部程序的输出时,双向通信会派上用场。