grep — поиск в тексте

При работе с регулярными выражениями мы в основном будем использовать нашу старую добрую приятельницу — программу grep. Название grep в действительности произошло от фразы «global regular expression print» (глобальный поиск с помощью регулярного выражения и вывод), то есть, как видите, grep имеет некоторое отношение к регулярным выражениям. В сущности, grep просматривает текстовые файлы в поисках совпадений с указанным регулярным выражением и выводит в стандартный вывод все строки с такими совпадениями.

До сих пор мы передавали программе grep фиксированные строки, например:

[me@linuxbox ~]$ ls /usr/bin | grep zip

Эта команда выведет список всех файлов из каталога /usr/bin, имена которых содержат подстроку zip.

Программа grep имеет следующий синтаксис:

grep [параметры] регулярное_выражение [файл...]

В табл. 19.1 перечислены наиболее часто используемые параметры grep.

Таблица 19.1. Параметры команды grep

Параметр

Описание

-i

Игнорировать регистр символов. Требует не различать символы верхнего и нижнего регистра. Аналогично работает параметр --ignore-case

-v

Инвертировать критерий. Обычно grep выводит строки с совпадениями. Этот параметр заставляет grep выводить строки, не содержащие совпадений. Аналогично работает параметр --invert-match

-c

Вывести число совпадений (или «несовпадений») в присутствии параметра -v вместо самих текстовых строк. Аналогично работает параметр --count

-l

Вместо строк с совпадениями выводить только имена файлов с найденными строками. Аналогично работает параметр --files-with-matches

-L

Действует подобно параметру -l, но выводит только имена файлов, где не найдено ни одного совпадения. Аналогично работает параметр --files-without-match

-n

В начале каждой строки с совпадением вывести ее номер в файле. Аналогично работает параметр --line-number

-h

Подавить вывод имен файлов при поиске по нескольким файлам. Аналогично работает параметр --no-filename

Давайте создадим несколько текстовых файлов, чтобы наше исследование grep стало более предметным:

[me@linuxbox ~]$ ls /bin > dirlist-bin.txt

[me@linuxbox ~]$ ls /usr/bin > dirlist-usr-bin.txt

[me@linuxbox ~]$ ls /sbin > dirlist-sbin.txt

[me@linuxbox ~]$ ls /usr/sbin > dirlist-usr-sbin.txt

[me@linuxbox ~]$ ls dirlist*.txt

dirlist-bin.txt dirlist-sbin.txt dirlist-usr-sbin.txt

dirlist-usr-bin.txt

Ниже показано, как выполнить простой поиск в нашем списке файлов:

[me@linuxbox ~]$ grep bzip dirlist*.txt

dirlist-bin.txt:bzip2

dirlist-bin.txt:bzip2recover

В этом примере grep просматривает все перечисленные файлы в поисках строки bzip и находит два совпадения, оба в файле dirlist-bin.txt. Если бы нам достаточно было получить только имена файлов с совпадениями, а не сами совпадения, мы могли бы добавить параметр -l:

[me@linuxbox ~]$ grep -l bzip dirlist*.txt

dirlist-bin.txt

Напротив, получить список файлов, не содержащих совпадений, можно так:

[me@linuxbox ~]$ grep -L bzip dirlist*.txt

dirlist-sbin.txt

dirlist-usr-bin.txt

dirlist-usr-sbin.txt