У меня есть файл данных, похожий на следующий. Я хочу grep "PANIC:", "Node 0/1/2/3:" и пустые строки, но хочу включить следующую строку (опция "-A1") только в один шаблон - "PANIC:", а не другие. Как это сделать.
Пожалуйста, помогите найти решение
# cat data.txt
Node 0:
DATE: 2020-12-19 04:06:44
DATE: 2020-12-19 07:02:54
PANIC: ABC
DATE: 2020-12-19 20:02:54
DATE: 2020-12-18 21:25:39
Node 1:
DATE: 2020-12-20 09:35:43
DATE: 2020-12-20 12:12:29
Node 2:
Node 3:
DATE: 2020-12-19 20:03:00
DATE: 2020-12-19 15:35:09
PANIC: XYZ
DATE: 2020-12-19 06:44:27
#
# cat data.txt | grep -A1 --no-group-separator -e PANIC: -e 'Node [0-7]:' -e ^$
Node 0:
DATE: 2020-12-19 04:06:44
PANIC: ABC
DATE: 2020-12-19 20:02:54
Node 1:
DATE: 2020-12-20 09:35:43
Node 2:
DATE: 2020-12-20 03:00:15
Node 3:
DATE: 2020-12-19 20:03:00
PANIC: XYZ
DATE: 2020-12-19 06:44:27
#
Ожидаемые отфильтрованные данные выглядят примерно так
Node 0:
PANIC: ABC
DATE: 2020-12-19 20:02:54
Node 1:
Node 2:
Node 3:
PANIC: XYZ
DATE: 2020-12-19 06:44:27
Использование awk
awk -F: ' /Node|PANIC/ { print; if ($1~/PANIC/) { getline; print} } ' data.txt
Полученные результаты:
$ awk -F: ' /Node|PANIC/ { print; if ($1~/PANIC/) { getline; print} } ' susanta.txt
Node 0:
PANIC: ABC
DATE: 2020-12-19 20:02:54
Node 1:
Node 2:
Node 3:
PANIC: XYZ
DATE: 2020-12-19 06:44:27
$
Вы можете сделать, как вы просите:
awk '/PANIC:/{print; getline; print} /Node [0-7]/ || /^ *$/' input
Хотя вы не упоминаете об этом в вопросе, ваш пример вывода демонстрирует, что вы также хотите объединить несколько пустых строк в одну пустую строку. Это можно сделать с помощью:
awk '/./{a=0} /PANIC:/{print; getline; print} /^ *$/ && !a++{print} /Node [0-7]/' input
Чтобы напечатать строку перед совпадением PANIC, вероятно, проще всего просто записать предыдущую строку. Что-то вроде:
awk '/PANIC:/{print prev; print; getline; print} { prev = $0 } /Node [0-7]/ || /^ *$/' input | perl -00pe1
Предварительное сопоставление немного хлопотно, но не так уж плохо. Просто сохраните предыдущую строку в переменной и распечатайте ее по мере необходимости. Я отредактирую ответ.
Великий Уильям. Спасибо за быстрый ответ. Просто быстрый вопрос, что, если бы мне пришлось включить предыдущую строку (опция "-B1" grep) в шаблон - "ПАНИКА:" - мне нужно написать для этого другой скрипт.