LINUX.ORG.RU

Удалить перевод строки перед паттерном

 ,


0

2

Есть длинный лог в котором встречаются записи такого вида:

timestamp hostname process Informational  YYYYYYYYYYYY  127.0.0.1  Match result. ID[12345] bla-bla-bla
	 [Policy] = 54321

Мне надо вытащить сопоставление всех ID и Policy (перебираю все записи по ID).
Всё было бы тривиально, если бы Policy находился на одной строке с ID
Очевидное решение - вытянуть Policy на предыдущую строку, для чего надо удалить предыдущий перевод строки (blah-blah-blah слишком вариативен и его трудно использовать в качестве паттерна, для удаления следующего перевода строки)
Вопрос собственно в том как это сделать
ping sdio, emulek

★★★★★

Грубо так

awk -F'[][]' '{id=$2; getline v; split(v,a," "); print id,a[3]}'

sdio ★★★★★
()
Ответ на: AWK от yoghurt

Переносимый вариант

/ID/ { if (match($9, "[0-9]+")) {
          id = substr($9, RSTART, RLENGTH)
          getline
          print id, $3
       }
     }
yoghurt ★★★★★
()

проще всего выводить _прошлую_ строку:

$ echo "1
2
3
4"|sed 'x'

1
2
3

#  добавляем + к строке, которая перед  строкой с "3"
$ echo "1
2
3
4"|sed '1{h;d};/3/{x;s/.*/&+/;x};x;${p;x}'
1
2+
3
4

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.