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

Источник: https://blog.xsk.in/it/logicheskie-operatsii-v-grep/289/
Опубликовано: 2013-10-14 · Рубрики: IT, Linux


1. [Операция ИЛИ](/#OR)
2. [Операция И](/#AND)
3. [Операция НЕ](/#NOT)
4. [Регулярные выражения](/#REGEX)

## <a name="OR"></a>Операция ИЛИ

### 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
```

## <a name="AND"></a>Операция И

### grep -E

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

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

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

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

## <a name="NOT"></a>Операция НЕ

### grep -v

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

## <a name="REGEX"></a>Регулярные выражения

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

```
$ 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
```

*Ссылки:*

- [Regular Expressions in Grep Command with 10 Examples – Part I](http://www.thegeekstuff.com/2011/01/regular-expressions-in-grep-command/)
- [Advanced Regular Expressions in Grep Command with 10 Examples – Part II](http://www.thegeekstuff.com/2011/01/advanced-regular-expressions-in-grep-command-with-10-examples-%E2%80%93-part-ii/)
- [15 Practical Grep Command Examples In Linux / UNIX](http://www.thegeekstuff.com/2009/03/15-practical-unix-grep-command-examples/)
- [Хабрахабр / Исследуем Linux Botnet «BillGates»](http://habrahabr.ru/post/213973/#comment_7364097)
- [An Introduction To Regular Expressions](https://www.digitalocean.com/community/articles/an-introduction-to-regular-expressions)

