Сопоставьте несколько регулярных выражений из одного файла с помощью awk

Я пытаюсь проанализировать HTML-файл с использованием сценариев оболочки.

Существует 4 разных регулярных выражения, которые мне нужно уловить: name= , age= , class= , marks= .

С помощью

 grep "name=\|age=\|class=\|marks=" student.txt 

Я могу получить нужные строки, но вместе с этими соответствующими строками мне также нужно распечатать вторую строку из каждого матча, содержащего оценку.

Обратившись к вопросу: Print Matching line и nth line из согласованной строки .

Я изменил код на:

 awk '/name=\|age=\|class=\|marks=/{nr[NR]; nr[NR+2]}; NR in nr' student.txt 

Но это, похоже, не работает. Как искать несколько регулярных выражений в одной команде awk ?

  • Есть ли удобный инструмент командной строки для управления заданиями Cron?
  • Количество пакетов, отправленных и полученных по интерфейсу
  • Как сделать необязательные аргументы, которые могут быть именами файлов, содержащими пробелы
  • Используя expr, $ (()), (())
  • Удалить строки из файла в зависимости от строк, найденных в другом файле
  • Как выполнить итерацию команды с двумя разными переменными?
  • Получить ветвь git из нескольких папок / репозиториев
  • sed Удалить строки, заканчивающиеся на %
  • 4 Solutions collect form web for “Сопоставьте несколько регулярных выражений из одного файла с помощью awk”

    Попробуйте:

     awk '/foo/||/bar/' Input.txt 

    awk regexps – это расширенные регулярные выражения, а grep без -E – это основное регулярное выражение. С расширенным регулярным выражением:

     awk '/name=|age=|class=|marks=/{nr[NR]; nr[NR+2]}; NR in nr' 

    Обратите внимание, что стандартное основное регулярное выражение не имеет оператора чередования, поэтому

     grep 'a\|b' 

    Как правило, это не работает в каждом grep (хотя некоторые из них, как GNU grep поддерживают его как расширение).

     grep -E 'a|b' grep -ea -eb grep 'a b' 

    Однако будет работать в каждом grep .

    Вы пытались использовать флаг «-A» с grep? После матча он будет печатать строки конечного контекста. Например: grep -A1 foo file.txt будет сопоставлять и печатать строки со словом foo, а также печатать строку, следующую за ней.

    Использование grep

    Что делать, если вы использовали контекстный переключатель в grep ( -A ) и задали 1 чтобы получить первую строку после совпадения?

     $ grep -E -A 1 "name=|age=|class=|marks=" student.txt 

    пример

    Пример файла.

     $ cat student.txt name= 1st line after name 2nd line after name age= 1st line after age 2nd line after age class= 1st line after class 2nd line after class marks= 1st line after marks 2nd line after marks 

    Затем, когда вы выполните приведенную выше команду:

     $ grep -E -A 1 "name=|age=|class=|marks=" student.txt name= 1st line after name -- age= 1st line after age -- class= 1st line after class -- marks= 1st line after marks 

    Использование awk

    Поскольку @RahulPatil предложил использовать конструкцию для awk :

     '/string1/||/string2/||...' 

    Что-то вроде этого сделает то, что вы ищете.

     $ awk ' /name=/||/age=/||/class=/||/marks=/{nr[NR]; nr[NR+1]}; NR in nr ' student.txt 

    пример

     $ awk ' /name=/||/age=/||/class=/||/marks=/{nr[NR]; nr[NR+1]}; NR in nr ' student.txt name= 1st line after name age= 1st line after age class= 1st line after class marks= 1st line after marks 
    Interesting Posts

    как найти изображения полностью белые?

    Как сделать GNU grep по умолчанию во FreeBSD?

    Могу ли я реплицировать DNS-записи в формате AXFR, если pdns-recursor находится перед авторитетным pdns

    Поддерживать имена файлов в виде отдельных аргументов в последовательных командах

    Измените количество строк и столбцов в TTY

    Сколько меняет ядро ​​Linux за один год?

    Устанавливайте ubuntu один или аналогичные услуги веб-хранения без их клиентов

    apache2: Не удалось открыть файл конфигурации /etc/apache2/apache2.conf: Ошибка ввода / вывода

    Почему мой DAD медленный?

    Bash Brace Shell Expansion Fail

    эквивалент linux / bash для mv -t

    Вирус «пойман» при использовании Linux неактивен, становится активным при входе в Windows, не так ли?

    loadkeys говорит: «Не удалось получить файловый дескриптор, ссылающийся на консоль» в chroot на ChromeOS

    Зачем придумать Мэдисон?

    Bash перезаписывает первую строку, приглашение PS1 bash

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