Мне нужно сопоставить строки, в которых есть ОСНОВНЫЕ и КРИТИЧЕСКИЕ строки
после слова 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
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
Это можно сделать с помощью grep
лайк:
$ grep "ERROR:[0-9]* \(CRITICAL\|MAJOR\)" /path/to/file
Другой способ сделать это в awk:
awk '$2 ~ /^ERROR:[[:digit:]]+/ && $3 ~ /^(MAJOR|CRITICAL)/' HW_Log.txt
Это ищет строки только в указанных полях, поэтому игнорирует их, если они появляются в другом месте строки. Он полагается на поведение awk по умолчанию для печати совпадающих строк (поэтому нет явного print
заявление). Это зависит от отсутствия пробелов или табуляции в первых трех полях.