Для этого можно использовать awk
:
Предполагая, что Trn-status
всегда предшествуетTECHNICAL EXCEPTION
awk -F'[\;\=]' '
{ if ( $0 ~ /Trn-status: INCOMPLETE/ ) checkid[$2]=$2 ;
if ( $2 == checkid[$2] ) {
if ( $0 ~ /TECHNICAL EXCEPTION/ ) print checkid[$2]
}
}' logfile
Пояснение:
-F'[\;\=]'
используйте либо ;
, либо =
в качестве разделителей полей; использование квадратных скобок позволяет вам определить несколько разделителей полей, точка с запятой и знак равенства являются специальными символами для awk
, поэтому вам нужно экранировать их обратной косой чертой $0
представляет собой всю строку, ~
представляет собой (подчиненный )оператор сопоставления с образцом и /PATTERN/
строку поиска. Поэтому, если мы находим Trn-status: INCOMPLETE
в строке, мы сохраняем поле ID (номер два, разделенное ;
и =
от других полей )в массиве checkid
, где индекс — это имя Сам ID(awk
позволяет использовать строки в качестве индексных счетчиков)TECHNICAL EXCEPTION
и распечатать идентификатор, если да logfile
имя вашего файла)