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