awk распечатать совпадение, только если последняя запись перед другим совпадением

Я хочу использовать awk для печати соответствия некоторого шаблона, только если это последняя строка файла перед некоторым постоянным текстом.

Например, я хочу напечатать значение «c», только если это последняя строка перед некоторым постоянным текстом:

cat file.txt: a=1 b=2 c=3 ...constant text... 

печать 3.

 cat file.txt: a=1 c=3 b=2 ...constant text... 

ничего не печатайте.

Как это сделать..? Как awk может узнать, является ли это последним номером файла?

  • Извлечение значений из файла с помощью нескольких ключей
  • Получить имена файлов в awk-результате
  • Добавить разделитель тысяч в число
  • Вывод в stdout работает, сбой при перенаправлении в файл или в fifo
  • извлечение доменных имен (имен хостов) из текстового файла
  • Разбор csv с использованием awk
  • Строка строк вложения для первых двух столбцов равна
  • Совместить данные из двух разных файлов
  • 2 Solutions collect form web for “awk распечатать совпадение, только если последняя запись перед другим совпадением”

    Я хочу использовать awk для печати соответствия некоторого шаблона, только если это последняя строка файла перед некоторым постоянным текстом.

    В этом случае попробуйте следующее:

     awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file 

    Примеры

     $ cat file1 a=1 b=2 c=3 ...constant text... $ awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file1 3 $ cat file2 a=1 c=3 b=2 ...constant text... $ awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file2 $ 

    Как это работает

    • -F=

      Это говорит awk использовать = в качестве разделителя полей. Таким образом, мы можем отделить имя и значение для полей, таких как a=1 или c=3 .

    • /constant text/ && name=="c"{print value}

      Если мы достигнем строки с constant text и name (как последним, установленным в предыдущей строке), c , тогда напечатайте value .

    • name=$1;value=$2

      Для текущей строки сохраните первое поле как name и второе поле как value .

    Некоторые поисковики нашли мне лучший ответ, хотя у меня уже есть ответ: использование tac делает его намного проще …

    tac file | awk 'NR==2{if ( $1=="c") print $2}'

    Номер строки один после «постоянного текста». Если «постоянный текст» – одна строка – NR==2 . Если это две строки – NR==3 . Еще не решил, в каком формате должен быть постоянный текст …

    Interesting Posts

    Измените порядок отображаемых полей произвольного вывода команды

    Как получить предложения по автоматическому пакету в командной строке?

    kill -STOP отключается

    Разница между двумя Linux-машинами

    обновить переменную PATH в .bashrc, используя sed

    fork () и как сигналы передаются процессам

    Удалите все запреты fail2ban в Ubuntu Linux

    Rsync исключить из корня

    Получить версию Debian для источников пакета Python

    Вращающиеся журналы iptables, странное сообщение о том, что скрипт преобразуется в стартовую работу

    Вход Crontab с часовым диапазоном, проходящим в полночь

    Можно ли запустить экземпляр shellshock для запуска команды в качестве привилегированного пользователя?

    Добавьте '.0' в целые числа с одной цифрой

    Создайте новый текстовый файл с суммой третьего столбца нескольких других

    Замените новые строки char (^ M) во всех файлах, а затем переименуйте файл на основе строки char

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