【问题标题】:How do you pipe input through grep to another utility?你如何通过 grep 管道输入到另一个实用程序?
【发布时间】:2010-11-01 14:58:15
【问题描述】:

我正在使用“tail -f”来跟踪更新的日志文件;接下来,我将其输出传递给 grep 以仅显示包含搜索词的行(在本例中为“org.springframework”);最后我想做的是将 grep 的输出通过管道传输到第三个命令“cut”:

tail -f logfile | grep org.springframework | cut -c 25-

cut 命令将为我删除每行的前 25 个字符如果它可以从 grep 获取输入!(如果我从链中删除 'grep',它会按预期工作。)

我在 bash 中使用 cygwin。

实际结果:当我添加第二个管道以连接到 'cut' 命令时,结果是它挂起,好像它在等待输入(以防您想知道)。

【问题讨论】:

  • 如果我在 grep 之后停止(没有“切割”的管道),它可以工作(不删除前 24 或 25 个字符)。
  • 这里真正的问题是,tail -f 永远不会完成,所以管道的其余部分一直在等待更多输入

标签: bash cygwin grep pipe cut


【解决方案1】:

假设 GNU grep,将 --line-buffered 添加到您的命令行,例如。

tail -f logfile | grep --line-buffered org.springframework | cut -c 25-

编辑:

我看到 grep 缓冲不是这里唯一的问题,因为 cut 不允许逐行缓冲。

您可能想尝试将其替换为您可以控制的东西,例如 sed:

tail -f logfile | sed -u -n -e '/org\.springframework/ s/\(.\{0,25\}\).*$/\1/p'

或 awk

tail -f logfile | awk '/org\.springframework/ {print substr($0, 0, 25);fflush("")}'

【讨论】:

  • --line-buffered 对我不起作用-缓冲 grep 的 输出。如果您执行 tail -f logfile|cut -c 25- 它仍然只是坐在那里。正在对 tail 的输出进行缓冲。
  • 已修改,好像你被剪切中的标准输出缓冲咬了,这些应该对你有用
  • 谢谢!这在管道链接多个 grep 时非常有用。例如someprogwithoutput | grep --line-buffered filterpattern | grep --color highlightpattern
  • fflush 是错字吗?
  • @thecoshman:我之前写过这个,但我不认为这是一个错字。这是一个强制输出刷新。 "" 参数是 gawk 特定的。
【解决方案2】:

在我的系统上,大约 8K 在我得到任何输出之前被缓冲。这个序列立即跟随文件:

tail -f logfile | while read line ; do echo "$line"| grep 'org.springframework'|cut -c 25- ; done

【讨论】:

    【解决方案3】:

    你所拥有的应该可以正常工作——这就是管道的全部理念。我看到的唯一问题是,在我拥有的cut 版本(GNU coreutiles 6.10)中,您应该使用语法cut -c 25-(即使用减号而不是加号)来删除前24 个字符。

    您还在两个示例中搜索不同的模式,以防万一。

    【讨论】:

    • 哎呀!我使用的是“减号” - 这是我的帖子中的错字
    猜你喜欢
    • 2018-11-17
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2017-06-15
    • 2016-09-30
    • 1970-01-01
    相关资源
    最近更新 更多