grep фильтр (egrep сортировка)

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

Аватара пользователя
bars
Сообщения: 630
ОС: BSD/LINUX

grep фильтр

Сообщение bars »

Привет.
Подскажите по задаче одной.
Есть скрипт он мониторинг ssl срок у доменов.
Так вот я пытаюсь от сортировать скрипт от определенного регистратора.
Если совпадения по регистратору есть (REG), то две верхние строки вместе названием регистратора нужно убрать.
Вроде же egrep -B 2 должен учитывать две строки выше, но что то не получается.

Код: Выделить всё

sh sh/check_ssl_domain.sh | egrep -C 1 '(Oct)[[:space:]]{1,6}[0-9]{1,2}[[:space:]]{1,6}202(1)' | egrep -B 2 -v "REG= R3"
Domain=mydom.com
End=Oct 21  2021
REG= R3
Domain=mydom.org
End=Oct 21  2021
REG= R3
--
Domain=mydom.net
End=Oct 21  2021
REG= R3
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 666
ОС: debian, fedora (i3-wm)

Re: grep фильтр

Сообщение olecya »

Попробуйте такую конструкцию вместо последней команды:

Код: Выделить всё

| tac | sed '/^REG= R3/,~3d' | tac
Если формат файла состоит только из повторяющихся приведенных 3 строчек:

Код: Выделить всё

| sed 'N;N;/\nREG= R3$/d'
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 630
ОС: BSD/LINUX

Re: grep фильтр

Сообщение bars »

olecya писала:
01.09.2021 13:09
Попробуйте такую конструкцию вместо последней команды:

Код: Выделить всё

| tac | sed '/^REG= R3/,~3d' | tac
Если формат файла состоит только из повторяющихся приведенных 3 строчек:

Код: Выделить всё

| sed 'N;N;/\nREG= R3$/d'
Не работает.
1 вариант нет утилиты tac.
2 вариант ничего не убирает.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 666
ОС: debian, fedora (i3-wm)

Re: grep фильтр

Сообщение olecya »

Код: Выделить всё

| sed '/^Domain/!b;N;N;/\nREG= R3/d'

Код: Выделить всё

| sed '/^Domain/N;/\nEnd/!b;N;/\nREG= R3/d'
Добавлено (21:39):
Почему-то во FreeBSD (ksh93) безусловный переход без метки не хочет выполняться, а завершающая групповая скобка требует точку с запятой:

Код: Выделить всё

| sed '/^Domain/N;/\nEnd/{N;/\nREG= R3/d;}'

Код: Выделить всё

| sed '/^Domain/{N;N;};/\nREG= R3$/d'
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 666
ОС: debian, fedora (i3-wm)

Re: grep фильтр

Сообщение olecya »

Написала вот такую красивую вещь. Удаляются три строки только по шаблону последней.
В буфере постоянно находятся три строки. В каждом цикле в конвейере удаляется первая и добавляется в хвост следующая:

Код: Выделить всё

sed '/\n/!N;N;/\nREG= R3$/d;P;D'
Но на фряхе если идет с последней строкой команда добавления N то выполнение прерывается без вывода буфера.
Теряется хвост. После гнутого седа, на каждом шагу чистая засада.
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 630
ОС: BSD/LINUX

Re: grep фильтр

Сообщение bars »

olecya писала:
01.09.2021 20:47
| sed '/^Domain/{N;N;};/\nREG= R3$/d'
Большое спасибо, работает во фряхе.
Чуть сократил свою команду.

Код: Выделить всё

egrep -C 1 '(Oct).*202(1)' | sed '/^Domain/{N;N;};/\nREG= R3$/d'
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 630
ОС: BSD/LINUX

Re: grep фильтр

Сообщение bars »

olecya писала:
01.09.2021 20:47
| sed '/^Domain/{N;N;};/\nREG= R3$/d'
Добрый день.
Поясните пожалуйста.
А что делает {N;N;} в sed '/^Domain/{N;N;};/\nREG= R3$/d'?
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 666
ОС: debian, fedora (i3-wm)

Re: grep фильтр

Сообщение olecya »

bars
При загрузке строки в буфер соответствующей шаблону /^Domain/ выполняется группа команд { ;}. В данном случае команда N означает добавление следующей строки к существующей в буфере через разделитель \n. А значит две команды N;N в итоге дадут в буфере 3 строки разделённые символом \n. Шаблон /\nREG= R3$/ из-за якоря $ применяется к последней строке в буфере, если он совпадает все три строки "удаляются" командой d. На самом деле здесь программа работает не совсем корректно по условию задачи. Она исходит от совпадения от строки "Domain...", что при определенном формате выходного потока может дать неверный результат.
Последний раз редактировалось olecya 02.09.2021 12:46, всего редактировалось 1 раз.
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 630
ОС: BSD/LINUX

Re: grep фильтр

Сообщение bars »

olecya писала:
02.09.2021 12:36
bars
При загрузке строки в буфер соответствующей шаблону /^Domain/ выполняется группа команд { ;}. В данном случае команда N означает добавление следующей строки к существующей в буфере через разделитель \n. А значит две команды N;N в итоге дадут в буфере 3 строки разделённые символом \n. Шаблон /\nREG= R3$/ означает шаблон к последней строке в буфере, если он совпадает все три строки удаляются командой d
Спасибо за пояснение про {N;N;};.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали: