如何通过grep管道输入到另一个实用程序?

时间:2009-06-09 20:40:06

标签: bash cygwin grep pipe cut

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

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

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

我正在使用cygwin和bash。

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

3 个答案:

答案 0 :(得分:29)

假设使用GNU grep,请将--line-buffered添加到命令行,例如

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

修改

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

您可能想尝试将其替换为您可以控制的内容,例如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("")}'

答案 1 :(得分:10)

在我的系统上,在获得任何输出之前,大约有8K被缓冲了。此序列立即跟踪文件:

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

答案 2 :(得分:-1)

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

你也在两个例子中搜索不同的模式,如果相关的话。