Логические операции в grep

  1. Операция ИЛИ
  2. Операция И
  3. Операция НЕ
  4. Регулярные выражения

Операция ИЛИ

grep \|

grep 'слово1\|слово2' файл_данных.txt

grep -E (расширенный regexp) и эквивалентный ему egrep

grep -E 'слово1|слово2' файл_данных.txt
egrep 'слово1|слово2' файл_данных.txt

grep -e

grep -e слово1 -e слово2 файл_данных.txt

Операция И

grep -E

grep -E 'слово1.*слово2' файл_данных.txt

(в только таком порядке)

grep -E 'слово1.*слово2|слово2.*слово1' файл_данных.txt
grep -E 'слово1' файл_данных.txt | grep -E 'слово2'

(независимо от порядка)

Операция НЕ

grep -v

grep -v 'слово1' файл_данных.txt

Регулярные выражения

Регулярные выражения состоят из двух типов символов: обычные символы языка и метасимволы, позволяющие усилить мощность выражений. Рассмотрим текстовый файл, содержащий перечисленные через запятую страны, их население и континент расположения:

$ cat country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Argentina,36955182,Latin America
Brazil,172860370,Latin America
Cameroon,15421937,Africa
Japan,126549976,Asia

Метасимволы ^ и $ указывают на начало и конец шаблона выражения:

$ egrep '^I' country.txt
India,1014003817,Asia
Italy,57634327,Europe

$ egrep 'e$' country.txt
Italy,57634327,Europe

Метасимвол точка (.) позволяет задать любой один символ в выражении, а обрамление в квадратные скобки []
указывает на наличие одного из шаблонов внутри скобов. Например, выбрать из файла все страны, начинающиеся на I или J с длиной 5 букв, можно так:

$ egrep '^[IJ]....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

Вместо 5 подряд точек можно указать их количество с помощью фигурных скобок {} (или квантификатора):

$ egrep '^[IJ].{4},' country.txt

Аналогично, можно задать вилку количества символов в шаблоне, например от 4 до 6:

$ egrep '^[IJ].{4,6},' country.txt

Для некоторых квантификаторов существуют короткие замены. Так, {0,1} эквивалентно ?, {0,}*, {1,}+, поэтому следующие две команды идентичны:

$ egrep '^ab{0,1}c$' filename
$ egrep '^ab?c' filename

Использование ^ вместе с […] дает отрицание. Выбрать все страны, не начинающиеся на I или J:

$ egrep '^[^IJ]' country.txt
Yemen,1184300,Asia

Вывести содержимое файла без пустых и начинающихся с «#» строк (применимо к файлам конфигурации) можно с помощью следующих команд:

grep -vE '^#|^$' файл_данных.txt
grep "^[^#]" файл_данных.txt
grep "^[$#]" файл_данных.txt

Ссылки: