Как найти строку после совпадения шаблона только для одного шаблона из многих

У меня есть файл данных, похожий на следующий. Я хочу 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
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
0
137
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Использование 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) в шаблон - "ПАНИКА:" - мне нужно написать для этого другой скрипт.

Susanta Dutta 21.12.2020 12:46

Предварительное сопоставление немного хлопотно, но не так уж плохо. Просто сохраните предыдущую строку в переменной и распечатайте ее по мере необходимости. Я отредактирую ответ.

William Pursell 21.12.2020 12:57

Другие вопросы по теме