Назад | Перейти на главную страницу

сценарий оболочки + сопоставление ОСНОВНЫХ и ВАЖНЫХ строк из файла журнала

Мне нужно сопоставить строки, в которых есть ОСНОВНЫЕ и КРИТИЧЕСКИЕ строки

после слова ERROR: <любое целое число>

пожалуйста, посоветуйте, как это сделать с помощью одной команды awk или sed?

  more HW_Log.txt



 CHK_HW             ERROR:0  INFO         self_monitor     Verifying HW machine 
 CHK_HW             ERROR:1  MAJOR        self_monitor     Verifying HW machine 
 CHK_HW             ERROR:1  CRITICAL     self_monitor     Verifying HW machine 

awk команда:

awk '/ERROR\:[0-9]+[ \t]+(CRITICAL|MAJOR)/ {print}' path_to_file

sed команда:

sed -ne '/ERROR\:[0-9]\+[ \t]\+\(CRITICAL\|MAJOR\)/p' path_to_file

awk описание:

 '/ERROR\:[0-9]+[ \t]+(CRITICAL|MAJOR)/ {print}'
  ^                                     ^
  regexp                                command
  • [0-9] + - одна или несколько цифр
  • [\ t] + - один или несколько пробелов и табуляция
  • (CRITICAL | MAJOR) - «CRITICAL» или «MAJOR»
  • print - строка печати

sed описание:

   -n, --quiet, --silent
          suppress automatic printing of pattern space

   -e script, --expression=script
          add the script to the commands to be executed

 '/ERROR\:[0-9]\+[ \t]\+\(CRITICAL\|MAJOR\)/p' 
 ^                                          ^
 regexp                                     command
  • [0-9] \ + - одна или несколько цифр
  • [\ t] \ + - один или несколько пробелов и табуляция
  • \ (CRITICAL \ | MAJOR \) - «КРИТИЧЕСКИЙ» или «MAJOR»
  • p - строка печати

Это можно сделать с помощью grep лайк:

$ grep "ERROR:[0-9]*  \(CRITICAL\|MAJOR\)" /path/to/file

Другой способ сделать это в awk:

awk '$2 ~ /^ERROR:[[:digit:]]+/ && $3 ~ /^(MAJOR|CRITICAL)/' HW_Log.txt

Это ищет строки только в указанных полях, поэтому игнорирует их, если они появляются в другом месте строки. Он полагается на поведение awk по умолчанию для печати совпадающих строк (поэтому нет явного print заявление). Это зависит от отсутствия пробелов или табуляции в первых трех полях.