Что ж, если у вас есть инструменты GNU, вы можете сделать:
for match in \
Server\ Health\ Check\ 1
Server\ Health\ Check\ 2
Errors\ caused\ by\ X
do grep -Fxm1 "$match"
case $match in
(S*) sed -nEu '/^[0-9/:]+/!q;p';;
(*) sed -u '4q;3d;1d';;
esac;done <file
Здесь предполагается, что есть некоторые промежуточные данные между интересующими вас разделами (иначе: cat
) .
Без инструментов GNU:
grep -nxE 'Server Health Check [12]|Errors caused by X' <file |
sed 's|\([^:]*\):S.*|\1,/\n.*[^0-9/:]/{\1!P?}?|
s|\([^:]*\):E.*|\1{N;s/.*\\n//p;N;s///p?}?|
y/?/\n/' | sed -e1!N -f- -eD ./file