正则表达式:没有跟着

时间:2013-06-13 20:36:07

标签: regex linux shell

我需要检查一个日志文件中是否有一个文本,例如server crashed ,后跟其他文本server is up again(因为如果我发现这样的情况,则意味着我必须手动启动服务器)。当然,在这些文本之间可能存在许多不同的界限。我想使用任何简单的linux命令行工具,例如。 pcregrep,但我没能创建一个正则表达式

5 个答案:

答案 0 :(得分:1)

您可以搜索与这两行中的任何一行匹配的任何行,然后只查看最后一行:

 grep "server crashed\|server is up again" | tail -n 1

 # Use extended regular expressions, which treat | as an operator without escaping it
 grep -E "server crashed|server is up again" | tail -n 1

 # Use egrep, a synonym for grep -E
 egrep "server crashed|server is up again" | tail -n 1

如果输出包含“server crashed”,则需要重新启动服务器。如果输出包含“服务器再次启动”,它仍在运行,您无需执行任何操作。

答案 1 :(得分:1)

我喜欢像这样的简单状态机的awk

awk '
    /server crashed/ {is_crashed=1}
    is_crashed && /server is up again/ {is_up_again=1; exit}
    END {
        if (! is_up_again) {
            print "Oops, crashed and NOT up again"
            exit 1
        }
    }
' filename

答案 2 :(得分:0)

你可以使用带有负前瞻断言的Perl的reggex(不确定你的grep是否这样做)

$ cat check.pl
$/=""; 
my $line = <>; 
$line =~ /(server crashed)(?!.+server is up again)/sg; 
print "$1\n";

$ perl check.pl < file_with_crash
server crashed

$ perl check.pl < file_with_crash_and_restart
$ # Nada

答案 3 :(得分:0)

这是你可以用awk做的事情 - 它正在颠倒顺序但它有效 - 当你得到结果时你可以做你喜欢的事情:

    cat file1.txt 
server crashed
a
server is up again
b
c
d
server crashed
server is up again

所以线条现在加在第二个回合之前:

awk '!(NR%2){print$0p}{p=$0}' file1.txt 
aserver crashed
bserver is up again
dc
server is up againserver crashed

现在让它只返回:服务器再次服务器崩溃

 awk '!(NR%2){if ($0p ~ "server is up againserver crashed") {print p$0 } }{p=$0} ' file1.txt
server crashedserver is up again

答案 4 :(得分:0)

以下命令将以最后一次发生服务器崩溃的行号开头提供单行输出:

grep -n 'server crashed' server.log | tail -n 1

然后对server is up again执行相同操作,并比较行号。