【问题标题】:Two successive Pipes两个连续的管道
【发布时间】:2017-05-30 22:05:12
【问题描述】:

这个命令行有问题吗:

Foo | awk '/Value1/{printf("%s,",$2)} /Value2/{printf("%s\n",$6)}' | awk '(NR % 5 == 1){print $0}'

其中Foo 是一个自定义程序。该命令过去可以正常工作。但是,由于最近更新了自定义分布(基于 Yocto)。似乎它不再起作用了。奇怪的是,awk '(NR % 5 == 1){print $0}' 没有被执行,整个命令也没有显示任何东西......

有什么想法吗?提前感谢您的帮助

【问题讨论】:

  • 第一个 awk 输出是否超过 5 行?
  • 确保Foo的输出有'Value1'或'Value2'
  • 嗯,第一个 AWK 按预期输出连续流。实际上,即使是这个简单的命令也不起作用:Foo | awk '/Value1/{printf("%s,",$2)} /Value2/{printf("%s\n",$6)}' | awk '{print $0}'
  • @JDoe 你用的是什么外壳? Foo | awk '/Value1/{printf("%s,",$2)} /Value2/{printf("%s\n",$6)}' > tmp && awk '{print $0}' < tmp 有效吗? Foo | awk '/Value1/{printf("%s,",$2)} /Value2/{printf("%s\n",$6)}' > >(awk '{print $0}') 怎么样?
  • 非常好的建议!第一个命令:Foo | awk '/Value1/{printf("%s,",$2)} /Value2/{printf("%s\n",$6)} > tmp && awk '{print $0}'

标签: shell awk pipe


【解决方案1】:

如果Foo | cmd 产生输出但Foo | cmd | awk '{print}' 没有,那么你的问题是缓冲。谷歌stdbuf line buffering(特别是http://www.pixelbeat.org/programming/stdio_buffering/)并像这样使用它:

Foo | stdbuf -o0 awk '...' | awk '...'

【讨论】:

  • 对不起,我不够清楚。绝对正确:在我添加第二个管道之前一切正常。顺便说一句,Foo | awk '1' | awk '1'works
  • 谢谢!哇……你救了我的命。你能解释一下为什么吗?
  • 不客气。您是否阅读了我在回答中给您的参考页?它详细解释了原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 2021-04-14
相关资源
最近更新 更多