我有一个像下面这样的模式
ServerA:port: OK
Process1 Description processname (processno) Running
Process2 Description processname (processno) Running
ServerB:port: OK
Process1 Description processname (processno) stopped
Process2 Description processname (processno) Running
ServerC:port: OK
Process1 Description processname (processno) stopped
Process2 Description processname (processno) Running
我可以使用下面的正则表达式捕获过程和过程状态
.*^(\w+).*[)]\s+(.*)\n
但是我也想捕获服务器名称。但是,如果我尝试添加
(.*):port:(.*)\n
到上面的表达式,它仅包括第一个过程。这怎么可能?
所以想法是要有一个表达式,该表达式可以查找已停止的进程,并捕获服务器名称以及错误,以便看起来更有意义。
我们有很多服务器及其端口状态以及进程状态的清单。有人可以看看这个吗?
编辑:这是一个示例,在实际情况下,每个服务器的进程数将有所不同(有些可能有3个进程,有些会有4个,有些6个)。
答案 0 :(得分:0)
尝试使用正则表达式:(?:^(.*):port:(?:.*)$)(?:\n.*\n*)\K(?:^(\w+).*[(](\w+)[)] +(?:stopped)$)
答案 1 :(得分:0)
查看此Perl单线解决方案
$ cat unitedartinc.txt
ServerA:port: OK
Process1 Description processname (processno) Running
Process2 Description processname (processno) Running
ServerB:port: OK
Process1 Description processname (processno) stopped
Process2 Description processname (processno) Running
ServerC:port: OK
Process1 Description processname (processno) stopped
Process2 Description processname (processno) Running
$ perl -0777 -ne ' while(/(^.+?):port:(.+?)(\n\n|\Z)/msg ) { $x=$1;$y=$2; while($y=~/(^\w+).+?[)]\s+(\S+)$/gms) { print "$x-$1-$2\n" }} ' unitedartinc.txt
ServerA-Process1-Running
ServerA-Process2-Running
ServerB-Process1-stopped
ServerB-Process2-Running
ServerC-Process1-stopped
ServerC-Process2-Running
$
或-这个
$ perl -0777 -ne ' while(/(^.+?):port:(.+?)(?-s:(?=^.+?:port)|\Z)/msg ) { $x=$1;$y=$2; while($y=~/(^\w+).+?[)]\s+(\S+)$/gms) { print "$x-$1-$2\n" }} ' unitedartinc.txt
ServerA-Process1-Running
ServerA-Process2-Running
ServerB-Process1-stopped
ServerB-Process2-Running
ServerC-Process1-stopped
ServerC-Process2-Running
$
答案 2 :(得分:0)
使用此正则表达式,您可以获得包含所需全部内容的数组。
使用多行标志全局运行。
(?m)(?:^(.*?):port:[ \t]*(.*)|(?!\A)\G)\s*^(\S+).*[)][ \t]*(.*)
https://regex101.com/r/ncUC0k/1
会产生一个不错的数组,您可以在
中进行筛选[
[ServerA , OK , Process1 , Running],
[ , , Process2 , Running],
[ServerB , OK , Process1 , Stopped],
[ , , Process2 , Running],
[ , , Process3 , Running],
[ , , Process4 , Running],
[ , , Process5 , Running],
[ServerC , OK , Process1 , Stopped],
[ , , Process2 , Running],
[ServerD , OK , Process1 , Stopped],
]
正则表达式评论
(?m) # Multi-line mode
(?: # Cluster
^ # BOL
( .*? ) # (1), Server
:port:
[ \t]* # trim
( .* ) # (2), Port statis
| # or,
(?! \A ) # Not BOS
\G # Start where last match left off
) # ---------
\s* # Many whitespace
^ # BOL
( \S+ ) # (3), Process
.*
[)] # last ')'
[ \t]* # trim
( .* ) # (4), Process status