Как получить значение после того, как определенная строка найдена в текстовом файле, используя сценарии оболочки - PullRequest
0 голосов
/ 02 октября 2018

У меня есть текстовый файл, и его содержимое выглядит следующим образом:

#SERVICE INFO:
 srv id         [8503]
 serv rqst id   xxxxxx               
 serv rqst len   [17]
 serv status     [C]

#SERVICE INFO:
 srv id         [8501]
 serv rqst id   xxxxxx  
 serv rqst len   [17]
 serv status     [C]


#SERVICE INFO:
 srv id         [8500]
 serv rqst id   xxxxxx  
 serv rqst len   [17]
 serv status     [C]

Я хочу прочитать идентификатор srv, найти его соответствующий статус и использовать его для дальнейшей проверки.

Например: для srv id 9500, статус serv: C

Я пробовал приведенное ниже выражение awk:

awk '{for (I=1;I<=NF;I++) if ($I == "service id") {print $(I+1)};}' $testfile

Это дает мне пустой вывод.

Здесь testfile - мой образец текстового файла.

Любой ввод приветствуется.

Ответы [ 3 ]

0 голосов
/ 02 октября 2018
awk -F '[][]' '$1 ~ /srv id/ {id = $2} $1 ~ /serv status/ {print id, $2}' file

Использует [ или ] в качестве разделителя полей.Если первое поле содержит идентификатор srv, запомните идентификатор.Если первое поле содержит «serv status», выведите идентификатор и значение статуса.

Вывод:

8503 C
8501 C
8500 C
0 голосов
/ 02 октября 2018

Если вы не возражаете против Perl:

perl -00 -ne 'm{srv id.+?(\d+).+status.+\[(\w)\]}s and print "$1 $2\n"' file

Это дает:

8503 C
8501 C
8500 C

Переключатель -00 указывает Perl читать файл в «режиме абзаца», гдеразделитель записей - это одна или несколько пустых строк.

Мы сопоставляем последовательность символов, которая начинается с "srv id" и заканчивается токеном "status", за которым следует его значение.Точка - это любой символ;+ означает один или несколько;а +? обозначает не жадное сопоставление.\d обозначает цифру, а \w символ слова.Открывающие и закрывающие квадратные скобки должны быть экранированы, чтобы обозначать самих себя.Чтобы точка соответствовала символу новой строки, мы добавляем модификатор s в конце шаблона совпадения m{...}s

Если вы хотите найти идентификатор для печати его статуса, просто grep для идентификатора в выводе, переданного по каналу grep:

perl ... | grep 8501
0 голосов
/ 02 октября 2018

Учитывая, что ваш Input_file такой же, как показанные примеры, не могли бы вы попробовать следующее.

awk '
/SERVICE INFO/ && srv && status{
  print srv " status is:" status
  srv=status=""
}
/srv id/{
  gsub(/\]|\[/,"",$NF)
  srv=$NF
  next
}
/serv status/{
  gsub(/\]|\[/,"",$NF)
  status=$NF
}
END{
  if(srv && status){
    print srv " status is:" status
  }
}'  Input_file

Вывод будет следующим:

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