Регулярное выражение вместе со строкой заголовка - PullRequest
0 голосов
/ 21 января 2019

У меня есть шаблон, как показано ниже

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 голосов
/ 21 января 2019

Проверьте это решение 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
$
0 голосов
/ 27 января 2019

Вы можете получить массив, содержащий все, что вам нужно, используя это регулярное выражение.
Работает глобально с многострочным флагом.

(?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],
]

Regex comments

 (?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
0 голосов
/ 21 января 2019

Попробуйте Regex: (?:^(.*):port:(?:.*)$)(?:\n.*\n*)\K(?:^(\w+).*[(](\w+)[)] +(?:stopped)$)

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...