Возможно, вам следует продолжать использовать sed . Использование N может добавить следующую строку ввода в пространство шаблона, после чего вы можете сопоставить \n между двумя строками.
См.:
sed ':a; N; $!b a; s/\n\s\{1,\}/ /g'
Существует множество способов сделать это, в том числе:
$ awk '/^ENDTIME/ {next}; NR>4' sourcefile
RtpNm01 CE_01 run full
RtpAcp01 CE_01 run full
RtpDynManLite01 CE_01 run full
RtpDynLiteInc01 CE_01 run full
Печатаются все входные строки после четвертой строки, за исключением любой строки, начинающейся с ENDTIME
.
Я думаю, это то, что вы пытались сделать с помощью этого странного цикла while (getline)
в блоке /Processname\s*....../
-в этом не было необходимости, awk уже перебирает каждую строку ввода, и вы можете проверить значение NR (номер текущей входной строки ).
и:
awk '! /^(STARTTIME|ENDTIME|=====|Processname)/' sourcefile
grep -vE '^(STARTTIME|ENDTIME|=====|Processname)' sourcefile
sed -E -e '/^(STARTTIME|ENDTIME|=====|Processname)/d' sourcefile
Все они выводят любые строки , кроме , соответствующие регулярному выражению. Все они используют одно и то же расширенное регулярное выражение (ERE -по умолчанию с awk
,включено с помощью -E
для grep
и sed
), чтобы искать любое из чередований в начале строки (, закрепленной с помощью^
).
и:
sed -e '1,4d; $d' sourcefile
Удалить строки с 1-й по 4-ю и последнюю строку.
Я изменил или (|| )добавить (&& )и все заработало.
cat rtpServiceStatusrun | awk '/Processname\s*Node\s*Status\s*QueueAv/{
while (getline){
if( $0 !~ /^====*/ && $0 !~ /^ENDTIME*/ ){
print $0
}
}
}'