0

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

4

5 回答 5

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

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

于 2013-06-13T21:35:19.270 回答
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
于 2013-06-13T23:58:18.983 回答
0

您可以将 Perl 的正则表达式与负前瞻断言一起使用(不确定您的 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
于 2013-06-13T21:01:36.010 回答
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
于 2013-06-13T21:05:56.803 回答
0

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

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

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

于 2013-06-13T21:10:02.380 回答