Сопоставьте несколько регулярных выражений из одного файла с помощью 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 ?

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 
  • Сортировка вывода ls, где файлы заканчиваются цифрами
  • Замена переменной, содержащей \ with sed
  • Список запросов серверов для выделенной памяти / процессора
  • Как объяснить следующий сценарий?
  • scp (v4) копирование с удаленного на несколько локальных имен файлов
  • Как извлечь определенные поля из строк с помощью команд оболочки?
  • sudo script - лучшая практика?
  • Почему не матч SHA?
  • Вопросы о функциях whiptail и bash
  • Проблема с переменной чтения от AWK
  • Как удалить файлы из папки с более чем 60 файлами в unix?
  • Interesting Posts

    shell howto: сохранить несколько файлов двоичных данных (jpg) в один файл с некоторыми дополнительными данными и снова отделить

    Автоматическое перезапуск сетевого подключения

    awk выдает выбор строк между двумя шаблонами

    Как перенаправить журналы в syslog для приложения, которое еще не поддерживает syslog?

    почему strace игнорирует мой псевдоним для rm?

    ImportError: /usr/lib64/libxml2.so.2: version `LIBXML2_2.9.0 'не найден

    Как сжимать и передавать папки с одного сервера на другой по сети

    Уведомления xfce не работают

    Solaris 10 не глобальных зон и rc-скриптов

    Не удается подключиться к ssh-серверу

    Как всегда распечатать приглашение на новой строке и сохранить ввод

    Очистка хром-файлов cookie с сайта при загрузке?

    Не могли бы вы объяснить, почему эта команда (pgrep -d ',' -f cmdStr | top -c -p) не работает?

    проверьте, установлен ли последний патч openssh, предоставленный RHEL

    Как использовать прокси SOCKS с yum?

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