У меня есть файл, debug.log , из которого я хочу извлечь все строки, которые непосредственно предшествуют указанному шаблону.

Пример:

1 blabla
2 blabla
3 HERE THE IMPORTANT THING
4 HERE IT MATCHES MY PATTERN
5 blabla
6 ANOTHER IMPORTANT THING
7 PATTERN
5 blabla

Ожидаемый результат:

HERE THE IMPORTANT THING
ANOTHER IMPORTANT THING

С помощью следующей команды я могу извлечь номер строки, соответствующей моему шаблону

grep -n PATTERN debug.log |cut -f1 -d:

Результат

5
8

Теперь я хотел бы вычесть одно к каждому из этих чисел, и получить соответствующую строку с чем-то вроде:

sed -n 4p debug.log
sed -n 7p debug.log

Это получает мой ожидаемый результат.

Можно ли это автоматизировать, чтобы мне не приходилось запускать sed вручную?

2 ответа2

2

Это проще и использует только grep:

grep -B1 PATTERN debug.log | grep -v 'PATTERN\|--'

или же,

grep -B1 PATTERN debug.log | grep -v -e 'PATTERN' -e '--'
0

Вы можете сделать это с помощью sed:

sed -n -e '/PATTERN/{x;p;x};h'

В каждой строке, если шаблон совпадает, выведите пробел. В любом случае, скопируйте текущую строку в пространство удержания для следующей итерации.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .