正则表达式以及标题行

时间:2019-01-21 11:10:54

标签: regex

我有一个像下面这样的模式

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个)。

3 个答案:

答案 0 :(得分:0)

尝试使用正则表达式:(?:^(.*):port:(?:.*)$)(?:\n.*\n*)\K(?:^(\w+).*[(](\w+)[)] +(?:stopped)$)

Demo

答案 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