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

Доброе утро,

Я пытаюсь написать сценарий 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 
  • Перепишите аргументы перед передачей их команде
  • Zsh скрипт, как конкатенировать элементы массива со строкой
  • Как найти и заменить значение столбца поля в UNIX
  • Поиск и удаление строк, содержащих несколько шаблонов в файле
  • Добавление ведущих символов перед строкой с использованием printf или echo
  • Получить конкретное слово и следующий текст
  • Выполнение нескольких команд sed в одних и тех же файлах одновременно
  • Как я могу использовать sed, чтобы отрезать строку от строки?
  • Заменить сложную строку в нескольких файлах
  • Как я могу добавить и добавить к каждому члену массива?
  • Как правильно извлекать различные части `dirname` в сочетании с` find`?
  • Interesting Posts

    SSH вызывает остановку цикла

    Какой простой Window Manager используется для веб-разработки?

    Каковы недостатки отключения THP и почему она включена по умолчанию во многих дистрибутивах?

    Объединить zipfile: с scp: чтобы открыть удаленный zip с vim

    Руководство по настройке Gentoo с полным шифрованием диска с использованием LUKS + LVM

    Арифметическая синтаксическая ошибка с числовой переменной

    Есть ли подборщик цветов, который работает с Wayland или XWayland?

    Почему я получаю разные результаты во время связи ftp при использовании ls filename и ls./filename

    Почему несколько консольных консольных консолей доступны / работают одновременно в системах RHEL?

    Выполнение пользовательской команды в Geany

    альтернатива для команды digest -a sha256 от solaris в linux

    Traceroute работает (очень медленно), но интернет не работает

    Создает ли каталог / etc только плохую идею?

    Как узнать, к какому пакету принадлежит файл?

    Неверное время запуска сценария sleep.d

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