在将输出从 tail -f 通过管道传输到 grep 后写入文件

Posted

技术标签:

【中文标题】在将输出从 tail -f 通过管道传输到 grep 后写入文件【英文标题】:write to a file after piping output from tail -f through to grep 【发布时间】:2011-07-17 12:17:03 【问题描述】:

我希望在将输出从 tail -f 传输到 grep 后写入文件。 比如说,将error_log“FreeSwitch.log”中所有带有“Playing:”的行写入一个文件“temp”。

 tail -f "/var/lof/freeswitch/freeswitch.log" | grep "Playing:" > temp

但不工作!这是一个centos 5.5

【问题讨论】:

【参考方案1】:

感谢您的帮助。

这是我用“错误”一词插入 mysql 的代码:

tail -f /var/log/httpd/error_log | \
grep -E --line-buffered "error" | \
while read line; do \
#echo -e "MY LINE: $line"; done
echo "INSERT INTO logs (logid,date,log) VALUES (NULL, NOW(), '$line');" | mysql -uUSERDB -pPASSDB DBNAME; done

【讨论】:

【参考方案2】:
-f, --follow[=name|descriptor]
              output appended data as the file grows;

随着文件的增长,它会扫描文件。这是一个有间隔的过程。你只能打断它。

使用参数:

-c, --bytes=K
              output the last K bytes; alternatively, use -c +K to output bytes starting with the Kth of each file  

-n, --lines=K
              output the last K lines, instead of the last 10; or use -n +K to output lines starting with the Kth

编辑:正如 bmk 所说:

grep --line-buffered  

认为它会帮助你

【讨论】:

【参考方案3】:

也许您对缓冲有疑问?见BashFAQ: What is buffering?

你可以例如试试:

tail -f /var/lof/freeswitch/freeswitch.log | grep --line-buffered "Playing:" > temp

【讨论】:

为我工作并修复了原始问题试图做的事情。此答案应标记为正确答案。【参考方案4】:

你把文件名放在>后面了吗?

tail -f /var/lof/freeswitch/freeswitch.log | grep "Playing:" > temp

【讨论】:

以上是关于在将输出从 tail -f 通过管道传输到 grep 后写入文件的主要内容,如果未能解决你的问题,请参考以下文章

我可以将多个 ffmpeg 输出通过管道传输到不同的管道吗?

管道流程输出到新流程

是否可以在 Mac 上将 Xamarin 输出通过管道传输到 less 中?

如何使用 Python 将标准输入/标准输出通过管道传输到 Perl 脚本

如果我将输出通过管道传输到 tee,则无法“继续”

Powershell:将外部命令输出通过管道传输到另一个外部命令