通过 grep 管道传输其中一个文件,同时对多个文件进行 tail 操作

通过 grep 管道传输其中一个文件,同时对多个文件进行 tail 操作

我想使用 tail 跟踪两个日志文件,但是其中一个日志文件的数据太多,所以我想用 grep 进行过滤。

tail -f file1 file2|grep mySearch

问题在于,两个文件都通过 grep 运行,或者说 tail 的输出通过 grep 运行。只有 file2 应该用 mySearch 的 grep 进行过滤。有什么想法吗?

我尝试过命名管道、进程替换和复合命令。

答案1

您可以在后台运行这两个尾部,将过滤和未过滤的输出传送到临时文件。

然后使用该临时文件作为您需要执行的任何操作的源 -

tail -f file1 >> temp &
tail -f file2 | grep mySearch >> temp &


do something with temp now

答案2

这里有好几种方法。我个人最喜欢的是多尾。它提供了多种配置和显示文件输出的方法,以及一系列通过正则表达式过滤输出的方法。例如,您可以过滤 1 个文件,同时保持另外 4 个文件不变。您也可以进行反向过滤,就像 一样grep -v

示例命令页面位于http://www.vanheusden.com/multitail/examples.html

你可能还会喜欢截图它的运行情况。ncurses 控制多个窗口。

如果你和我一样喜欢编程,你可以用类似 Perl 的方法来创建一个个性化的解决方案文件::尾巴模块select在单独的句柄上使用。

答案3

Multitail 听起来正是我所需要的。

这是我一直在做的事情,除了日志行不是按精确的时间顺序排列之外,其他都很好。

-------------8<-------------

#!/bin/bash

function pidof_prog_file() {
 PGM=$1
 FIL=$2
 lsof -n 2>/dev/null| grep "${PGM}.*${FIL}" | tr -s ' ' | cut -d' ' -f 2
 }

T="tail -n 10 -f"

kill -TERM `pidof_prog_file tail application.log`
$T /var/www/protected/runtime/application.log | tr '\t' ' ' | tr -s ' ' | sed "s|^|PHP:|" &

kill -TERM `pidof_prog_file tail access.log`
$T /var/log/apache2/access.log | tr '\t' ' ' | tr -s ' ' | sed "s|^|HTTP:|" &

kill -TERM `pidof_prog_file tail catalina.out`
$T /var/log/tomcat6/catalina.out  | tr '\t' ' ' | tr -s ' ' | sed "s|^|JAVA:|" &

kill -TERM `pidof_prog_file ssh devj-db`
sudo -u $ME ssh $dbhost "$T /var/log/mysql/query.log"  | tr '\t' ' ' | tr -s ' ' | sed "s|^|SQL:|"

相关内容