【问题标题】:Unable to pipe output after grepgrep 后无法通过管道输出
【发布时间】:2017-11-03 12:56:18
【问题描述】:

我正在过滤 Apache 日志,但连接多个过滤器时没有输出。试图将问题减少到一个最小的例子,似乎 grep 无法将输出转发到管道

$ tail -F access_log | grep test
10.108.57.6 - - [03/Nov/2017:12:35:55 +0000] "GET /test HTTP/1.1" 404 202 "-" "curl/7.11.0 (i686-pc-linux-gnu) libcurl/7.11.0 OpenSSL/1.0.2d ipv6 zlib/1.1.3" 161

$ tail -F access_log | grep test | grep test
# nothing

$ tail -F access_log | grep test | sed 's/test/asd/g'
# nothing

$  tail -F access_log | sed 's/test/asd/g' | grep asd
10.108.57.6 - - [03/Nov/2017:12:44:58 +0000] "GET /asd HTTP/1.1" 404 202 "-" "curl/7.11.0 (i686-pc-linux-gnu) libcurl/7.11.0 OpenSSL/1.0.2d ipv6 zlib/1.1.3" 143

有灯吗?

我在 Centos 7.2 上,使用 grep 2.20

【问题讨论】:

  • 当您发出请求时,您确定有与您的| grep test | grep test 示例匹配的请求吗?问题是每次运行命令时数据都不同。我建议创建一个静态文件,其中包含一些您知道要过滤和操作并通过管道收集它们的请求
  • 当然,问题是在同一个 test 页面上重复请求时重现的,如第一个示例所示

标签: bash grep pipe


【解决方案1】:

用于 grepping 流 (tail -f)
使用grep --line-buffered 几乎总是比使用grep 更好

来自官方文档:

--line-buffered 在输出上使用行缓冲。这可能会导致性能下降。

换句话说:每次grep得到输入时写输出,不要等待填充grep缓冲区

【讨论】:

  • sed 也缓冲行,所以如果你的行很短,请使用 -u 选项
猜你喜欢
  • 2012-12-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多