我想使用 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:|"