Греп от последнего появления шаблона к другому шаблону

Доброе утро,

Я пытаюсь написать сценарий UNIX для файла с несколькими повторяющимися шаблонами, за которым следует шаблон, который я ищу. Этот вопрос очень похож на: « Получить последнее вхождение шаблона перед другим шаблоном ». Однако у меня нет «tac» (или «tail -r»), и я хочу вернуть последнее вхождение String1 перед String2 и String2.

output.out:

... Condition 1: A foo Condition 1: B foo Condition 2: C foo Condition 1: D foo Condition 1: E foo Condition 2: F ... 

Я бы хотел написать сценарий grep / sed / awk для возврата:

 Condition 1: B Condition 2: C Condition 1: E Condition 2: F 

Поскольку условие 1 всегда является «х» линиями выше условия 2, я попытался использовать:

 grep -B x "Condition 2" 

И переход оттуда, но по какой-то причине второе появление в результирующем выпуске скрипта останавливает несколько строк сверху (поэтому не отображает условие 1) из-за пустых строк между условием 1/2, возможно, я не уверен, что причина. Поэтому я отказался от использования grep -B. Я думаю, что tac поможет, поскольку я мог бы grep «назад», но у меня нет команды tac (или tail -r) в моей среде.

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

3 Solutions collect form web for “Греп от последнего появления шаблона к другому шаблону”

Ну, если grep работает неправильно, неизвестно, работает ли awk , но вы можете попробовать:

 awk '/Condition 1/ { acc = $0; } /Condition 2/ { print acc; print; }' input 

Более общее использование на основе альтернативного условия (не всегда в цикле 2-1). Он запоминает последнее условие и сравнивает его, изменив или нет, и распечатает последнее условие, если оно изменится, если не запомнит его. Также распечатайте последнее напоминание на выходе и инициируйте цикл повторения с первым состоянием.

 awk -F '[[:blank:]:]*' /^Condition/ { if (Index == $2) Last = $0 else if (Index ~ /^$/) Index = $2; Last = $0 elseprint Last Index = $2 } END { print Last } ' YourFile 

Это версия sed

 sed -rn ' /Condition [0-9]+:/ { H x /(Condition [0-9]+:).*\1/{$bX; d} P;$bX d } ${:X x;p} ' file Condition 1: B Condition 2: C Condition 1: E Condition 2: F 
  • grep окружающие символы матча
  • Bash - Замена случайного числа между кавычками
  • Изменение вхождения строки в файл при соблюдении новых строк строки DOS
  • сохранить только определенную часть строки в определенном столбце
  • Стандарты для строк с двойными кавычками
  • Как вставить содержимое файла в строку в bash
  • У меня есть многострочная строка, которую мне нужно перебрать, но я не использую bash. Совет?
  • Как я могу правильно использовать команду sed в этом конкретном сценарии
  • Трубы Дженкинса, ш, кавычки и пробелы
  • извлекать часть текста из всех совпадающих строк
  • Sed - замена строк с помощью группировок
  • sed для замены совпадающего слова на конец строки
  • Interesting Posts

    С помощью кнопочной панели Synaptics «AreaBottomEdge» предотвращает щелчок правой кнопкой мыши

    «Невозможно получить сертификат локального эмитента» и «неизвестное имя tlsv1»,

    Переменная Shell variable vs. Environment, какая из них предпочтительна, если оба имеют одно и то же имя?

    Привязать специальный USB-выход

    Как вы инвертируете команду «locate». Ex. Показать все, кроме X

    читать номера телефонов из файла и хранить их в другом файле уникально

    как разделить размер печати в размере MiB вместо MB

    Использование xkeybinds на безголовом узле для HUID USB Device I / O

    В чем смысл состояния UNCLEAN в iptables

    Каков маршрут внутри локальной сети?

    Используйте curl для загрузки списка файлов в csv

    Добавление правил на мой почтовый сервер

    Проблема при установке адаптера беспроводной связи alink MT7601U на centos 7

    Какие файлы .x в / usr / include?

    Как клонировать только мой раздел Linux с моего жесткого диска 500 ГБ на SSD на 250 ГБ?

    Linux и Unix - лучшая ОС в мире.