通过多个grep命令过滤tail命令以分隔文件

Rya*_*yan 5 linux bash grep tail

我想要做的是基于 grep 过滤器将一个日志文件的输出过滤为单独的日志文件。

tail -f test.log | tee >(grep "Error" > error.log) >(grep "Warning""> warning.log)

这样所有“错误”条目都在一个文件中,所有“警告”条目都在一个单独的文件中。

我知道这在概念上是有效的,因为如果我使用cat而不是tail,我会得到正确的文件输出,但无法实时跟踪更改(我需要这样做,因为我正在查看主动运行的测试的输出日志)

此外,如果我从grep命令中删除“>”文件重定向器,它会将各个 grep 输出正确输出到控制台;但是,我也想要一个录音文件。

回答:

写入文件时,grep的输出被缓冲。使用带有--line-buffer选项的egrep修复了该行为。

新命令如下所示:

tail -f test.log | tee >(egrep --line-buffered "ERROR" > error.log) >(egrep --line-buffered "WARNING" > warning.log)

hol*_*eap 0

如果您使用多条线来执行此操作可能会更容易。你可以写一个 bash 脚本:

#!/bin/bash

tail -f test.log | while read line; do
    if echo "$line" | grep -q "Error"; then
        echo "$line" >> error.log
    elif echo "$line" | grep -q "Warning"; then
        echo "$line" >> warning.log
    # The following is in case you want to print out lines that do not match 
    else
        echo "$line"
    fi
done
Run Code Online (Sandbox Code Playgroud)