Самыми распространенными утилитами для парсинга файлов в Linux являются команды grep
, egrep
, sed
и awk
.
Из данной статьи вы узнаете, как выполнить поиск строк в файле по нескольким условиям, которые задаются логическими операторами OR
, AND
, NOT
с помощью grep
, egrep
, sed
и awk
из командной строки в Linux.
Я приведу примеры того, как найти все строки в файле, соответствующие любому из нескольких условий (регулярных выражений), строки которые соответствуют каждому из перечисленных условий, а также как напечатать файл, исключив строки попадающие под указанное условие.
Дельный Совет: Поиск и валидация email адресов с помощью команды grep
! Лучшее регулярное выражение для поиска email адресов! Читать далее →
GREP OR: Любое Из Нескольких Условий
Поиск строк в файле, в которых содержится любое из перечисленных регулярных выражений.
Используя команду grep
и egrep
:
$ grep "ВЫРАЖЕНИЕ1\|ВЫРАЖЕНИЕ2" FILE $ grep -E "ВЫРАЖЕНИЕ1|ВЫРАЖЕНИЕ2" FILE $ grep -e ВЫРАЖЕНИЕ1 -e ВЫРАЖЕНИЕ2 FILE $ egrep "ВЫРАЖЕНИЕ1|ВЫРАЖЕНИЕ2" FILE
Используя команду awk
:
awk '/ВЫРАЖЕНИЕ1|ВЫРАЖЕНИЕ2/' ФАЙЛ
Используя команду sed
:
sed -e '/ВЫРАЖЕНИЕ1/b' -e '/ВЫРАЖЕНИЕ2/b' -e d ФАЙЛ
GREP AND: Каждое Из Условий
Также, очень часто возникает необходимость grep
-нуть файл по нескольким условиям — это когда нужно найти все строки в файле, которые соответствуют каждому из нескольких регулярных выражений.
Обратите внимание, что вы можете осуществить поиск строк в файле которые содержат регулярные выражения, как в определенном, так и в произвольном порядке.
Используйте одну из приведенных ниже команд, чтобы найти и напечатать все строки в файле, которые соответствуют нескольким условиям.
Используя команду grep
(в такой последовательности):
$ grep -E 'ВЫРАЖЕНИЕ1.*ВЫРАЖЕНИЕ2' ФАЙЛ
Используя команду grep
(в любой последовательности):
$ grep -E 'ВЫРАЖЕНИЕ1.*ВЫРАЖЕНИЕ2|ВЫРАЖЕНИЕ2.*ВЫРАЖЕНИЕ1' ФАЙЛ $ grep 'ВЫРАЖЕНИЕ1' ФАЙЛ | grep 'ВЫРАЖЕНИЕ2'
Дельный Совет: На сервере закончилась память? Узнайте какой процесс съел всю RAM и SWAP! Одна строка на Bash для настоящих Linux админов! Читать далее →
Используя команду awk
(в такой последовательности):
$ awk '/ВЫРАЖЕНИЕ1.*ВЫРАЖЕНИЕ2/' ФАЙЛ
Используя команду awk
(в любой последовательности):
$ awk '/ВЫРАЖЕНИЕ1/ && /ВЫРАЖЕНИЕ2/' ФАЙЛ
Используя команду sed
(в такой последовательности):
$ sed '/ВЫРАЖЕНИЕ1.*ВЫРАЖЕНИЕ2/!d' ФАЙЛ
Используя команду sed
(в любой последовательности):
$ sed '/ВЫРАЖЕНИЕ1/!d; /ВЫРАЖЕНИЕ2/!d' ФАЙЛ
GREP NOT: Исключение
Дельный Совет: Поиск и валидация IP адресов с помощью команды grep
! Лучшее регулярное выражение для поиска IP адресов Читать далее →
Поиск и печать строк из файла, которые не содержат указанное регулярное выражение.
Используя команду grep
:
grep -v 'ВЫРАЖЕНИЕ1' ФАЙЛ
Используя команду awk
:
awk '!/ВЫРАЖЕНИЕ1/' ФАЙЛ
Используя команду sed
:
sed -n '/ВЫРАЖЕНИЕ1/!p' ФАЙЛ
$ grep ‘PATTERN1’ FILE | grep ‘PATTERN2’ works under csh but not under bash
grep mynetworks /etc/postfix/main.cf | grep #
Usage: grep [OPTION]… PATTERN [FILE]…
Try ‘grep —help’ for more information.
You can certainly pipe grep into another grep in bash. In your case, you need to escape the octothorp (#) or surround it with quotes. All of the following will work in bash:
grep mynetworks /etc/postfix/main.cf | grep \#
grep mynetworks /etc/postfix/main.cf | grep «#»
grep mynetworks /etc/postfix/main.cf | grep ‘#’
grep mynetworks /etc/postfix/main.cf | grep «#»
it is helpfull
A nice summary that covers all use cases… thank you!