Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式:后面不跟_Regex_Linux_Shell - Fatal编程技术网

Regex 正则表达式:后面不跟

Regex 正则表达式:后面不跟,regex,linux,shell,Regex,Linux,Shell,我需要检查日志文件中是否有一个文本,例如服务器崩溃,即未,然后是其他文本服务器再次启动(因为如果我发现这种情况,意味着我必须手动启动服务器)。当然,这些文本之间可能有许多不同的行。我想使用任何简单的linux命令行工具,例如pcregremp,但是我没有创建一个regex,你可以使用Perl的reggex,并带有否定的前瞻断言(不确定你的grep是否做到了) $cat check.pl $/=""; 我的$line=; $line=~/(服务器崩溃)(?!.+服务器再次启动)/sg; 打印“$

我需要检查日志文件中是否有一个文本,例如
服务器崩溃
,即,然后是其他文本
服务器再次启动
(因为如果我发现这种情况,意味着我必须手动启动服务器)。当然,这些文本之间可能有许多不同的行。我想使用任何简单的linux命令行工具,例如pcregremp,但是我没有创建一个regex,你可以使用Perl的reggex,并带有否定的前瞻断言(不确定你的grep是否做到了)

$cat check.pl
$/=""; 
我的$line=;
$line=~/(服务器崩溃)(?!.+服务器再次启动)/sg;
打印“$1\n”;
$perl check.pl<带有崩溃的文件
服务器崩溃
$perl check.pl<带有崩溃和重启的文件
$#纳达

以下是您可以使用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

以下命令将给出以上次服务器崩溃发生的行号开始的单行输出:

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

然后对服务器再次启动执行相同操作,并比较行号。

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

 grep "server crashed\|server is up again" | tail -n 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

1.请发布您迄今为止尝试的内容,包括您的代码/脚本。2.如果有人不知道您的服务器日志是什么样子的,就很难回答这个问题,您需要提供示例。3.服务器管理问题位于serverfault.com。这不是服务器问题。这是一个正则表达式问题。服务器只是一个例子来说明这一点。我尝试过:
pcregrep-M'服务器崩溃(\n |)*(?!.*服务器再次启动)'logfile.log
server命令帮助仍然是属于它的。相信我,那些家伙和我们一样了解Regex。试着连接到服务器不是更好吗?如果你不能,调查它是否关闭了?我能想到很多服务器可能会停机的原因,但通知没有写入某个日志文件…我认为,要包括边缘情况,应该是“如果输出包含“服务器崩溃”,则需要重新启动服务器。否则它仍在运行”。但这基本上解决了问题,即使没有复杂的正则表达式。感谢
-P
的NU grep应该处理这个问题。
 # 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
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