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