(g)awk似乎缓存了shell命令的输出 - 如何避免?

时间:2015-07-09 10:27:38

标签: linux shell awk

我有一个奇怪的问题gawk,我不知道这是一个bug或awk的默认行为,我只是不明白。基本上,当我在awk脚本中执行shell命令并使用getline捕获其输出时,该命令的所有连续调用似乎产生与第一个相同的输出。这是一个例子:

# <foo.awk 

BEGIN {
  for(i = 0; i < 5; i++) {
    "date +%s" | getline sec
    print sec
    system("sleep 1")
  }
}
# gawk -f foo.awk
1436437519
1436437519
1436437519
1436437519
1436437519
# 

我想知道这种行为是否是故意的,并在手册的某处解释(我找不到任何东西),以及是否有办法解决它。

1 个答案:

答案 0 :(得分:3)

完成每次执行命令后,必须关闭()管道:

$ cat foo.awk
BEGIN {
  cmd = "date +%s"
  for(i = 0; i < 5; i++) {
    cmd | getline sec
    print sec
    close(cmd)
    system("sleep 1")
  }
}

$ awk -f foo.awk
1436451378
1436451379
1436451380
1436451381
1436451382

请务必阅读并完全理解Arnold Robbins(尤其是http://www.gnu.org/software/gawk/manual/gawk.html#Getline_002fVariable_002fPipe)“有效Awk编程”第4版中的getline部分,并完全理解http://awk.info/?tip/getline处的所有内容你正在考虑使用getline,然后通常你会意识到这是一种更好的方法。