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