28

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

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

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

我在 bash 中使用 cygwin。

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

4

3 回答 3

29

假设 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("")}'
于 2009-06-10T21:24:30.307 回答
12

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

tail -f logfile | while read line ; do echo "$line"| grep 'org.springframework'|cut -c 25- ; done
于 2009-06-10T21:12:49.173 回答
-1

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

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

于 2009-06-09T20:46:11.930 回答