【问题标题】:How to pass output of grep to sed with tail -f command如何使用 tail -f 命令将 grep 的输出传递给 sed
【发布时间】:2021-04-07 06:10:07
【问题描述】:

我正在尝试使用 tail -f |grep 命令过滤掉日志文件中的某些行:

tail -f /path/to/file.log |grep error

这工作正常,我只从日志中得到一个很好的错误流。

它的输出在每一行的开头都有整个日期字符串,例如。 2021 年 4 月 7 日

我想过滤掉每行的前 11 个字符 (07-Apr-2021)

所以我尝试了以下方法:

tail -f /path/to/file.log |sed 's/...........//'

这也可以正常工作,并删除每行的前 11 个字符。

然后,我同时尝试了 grep 和 sed,这样我只会得到错误消息,而开头没有日期:

tail -f /path/to/file.log |grep error |sed 's/...........//'

我没有得到任何输出。我也试过了:

tail -f /path/to/file.log |sed 's/...........//' |grep error

同样 - 没有输出。我没有收到任何错误,我只是得到一个没有输出的闪烁光标。 显然我做错了什么,任何帮助将不胜感激。

【问题讨论】:

    标签: linux bash sed grep


    【解决方案1】:

    在这里尝试修复 OP 的尝试。请尝试以下。由于没有附上样品,无法测试;不过应该可以。

    tail -f /path/to/file.log | grep --line-buffered "error" | sed -E 's/^.{11}//'
    

    来自man grep

    --行缓冲 在输出上使用行缓冲。

    我还在这里修复了你的 sed 替换,你不需要在这里提到 11 个点,你可以像上面显示的那样使用正则表达式来处理。



    第二个解决方案:在单个 awk 中,您可以执行以下操作。

    tail -f Input_file | awk '/error/{sub(/^.{11}/,"");print;fflush()}'
    

    【讨论】:

    • 只要 Awk 不写入管道,您就不需要在此处刷新。当标准输出是管道时会出现缓冲问题。
    • @tripleee,所以如果我在这里得到正确的 fflush,它应该类似于tail -f file | awk '/error/{sub(/^.{11}/,"");print;fflush()}' 以继续打印值。编辑:我刚刚用越来越多的行 tail -f file1 | awk '/error/{sub(/^.{11}/,"");print;fflush()}' 对其进行了测试,它工作正常,现在让我编辑我的解决方案。
    • 谷歌搜索后,我意识到这也取决于您的 awk 版本。我想说的是,您也许可以在print 之后省略fflush(),但现在我不完全确定它是否健壮和便携。
    • @tripleee,我刚刚用增加的行 tail -f file1 | awk '/error/{sub(/^.{11}/,"");print;fflush()}' 对其进行了测试,它工作正常,让我现在编辑我的解决方案。
    【解决方案2】:

    感谢您的回答,我发现我没有得到输出的原因是我需要为 grep 使用 --line-buffered(感谢 ravindersingh13)。关于 sed 命令,这是我最终使用和工作的:

    tail -f /path/to/file.log | grep --line-buffered "error" | sed -r 's/{11}//'
    

    这会删除 grep 输出的前 11 个字符。

    【讨论】:

    • sed 命令已损坏;你在{11} 之前漏掉了一个点。 -E-r 的问题在于它们不可移植。
    【解决方案3】:

    摆脱useless grep 也可能是一种选择,而且可以说更优雅。

    tail -f /path/to/file.log |
    sed -n '/error/s/...........//p'
    

    【讨论】:

      猜你喜欢
      • 2012-08-29
      • 1970-01-01
      • 2021-03-29
      • 2014-01-13
      • 2019-02-16
      • 2017-12-15
      • 2015-08-03
      • 2014-11-02
      • 1970-01-01
      相关资源
      最近更新 更多