Вполне возможно самая популярная из существующих команд в Unix/Linux: grep вырезает нужные вам строки из текстовых файлов которые содержат указанный пользователем текст.
Добавил: Amro   Дата: 11.01.2015 21:36

grep это вполне возможно самая популярная из существующих команд в Unix/Linux. Многие бы с этим поспорили, но стоит начать использовать grep, эта команда будет присутствовать почти во всех ваших скриптах для консоли Linux. grep расшифровывается как ‘global regular expression printer‘. Иными словами grep вырезает нужные вам строки из текстовых файлов которые содержат указанный пользователем текст.

grep может быть использован двумя путями — сам по себе или в комбинации с потоками.

Использование grep в чистом виде

$ grep '12:00' /home/david/backup/log.txt

Эта команда показывает как можно использовать grep для того чтобы получить строки из файла содержащие подстроку указанную в командной строке. Файл не обязательно должен оканчиваться на .txt. Показанная выше команда производит поиск подстроки 12.00 в файле /home/david/backup/log.txt и отображает все строки где эта подстрока встречается.

Эта комбинация может быть использована например для поиска бэкапов которые происходили в 12:00.

$ grep -v '12.00' /home/david/backup/log.txt

А вот эта команда (с использованием ключа -v) наоборот покажет только те строки где подстрока ’12:00′ не встречается.

$ grep -l 'delay' /code/*.c

Эта команда будет искать все файлы оканчивающиеся на .c и текст в найденных файлах соответствующий подстроке 'delay' и в конечном итоге выведет только имена файлов где эта подстрока встречается.

$ grep -w '\<bay' * $ grep -w 'watch\>' *

Эта команда уже более сложная и состоит из комбинации двух команд grep. Первая ищет строки которые начинаются со слова ‘bay’ а вторая строки которые заканчиваются на слово ‘watch’.

Использование grep вместе с потоками

$ ls -l | grep rwxrwxrwx

Вы наверно уже знаете что команда ls -l отображает подробный список файлов в директории. Часть grep rwxrwxrwx фильтрует результат полученный от ls -l и выводит только те директории у которых установлены соответствующие права доступа. В данном случае это открытый доступ на чтение, запись и поиск для всех пользователей и групп. Так что вместо того чтобы увидеть полный список файлов вы увидите только те файлы у которых установлены нужные вам права доступа.

Вывод от команды grep может также быть направлен потоком в другую команду, например как в следующем примере:

$ du | grep 'mp3' | more

Вы должны уже догадаться что делает указанная выше команда  Если не догадались то все просто — она выводит постраничный список mp3 файлов найденных в текущей директории.

$ grep '^#' /home/david/script1 | more

Эта команда отобразит все строки в файле /home/david/script1 которые начинаются с символа ‘#’. Определение тип ‘^#’ означает что символ ‘#’ должен быть первым символом в строке.

$ grep -v '^[0-9]' /home/david/backup/log.txt | more

Эта команда ищет строки содержащие в первом символе цифры от 0 до 9 а потом выводит только те строки которые не попали в результаты поиска. Как вы видите — был использован ключ ‘-v’ означающий реверсивный поиск.

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

Некоторые дополнительные ключи команды grep:

  • -v : Выводит реверсивные результаты. Вместо того чтобы вывести строки где искомое было найдено — выводи те строки где искомой подстроки нет.
  • -c : Отключает стандартный способ вывода результата и вместо этого отображает только число обозначающее количество найденных строк.
  • -i : Делает поиск регистронезависимым
  • -w : Ведет поиск по цельным словам. Например при обычном поиске строки ‘wood’ grep может найти слово ‘hollywood’. А если используется данный ключ то будут найдены только строки где есть слово ‘wood’.
  • -l : Выводит только имена файлов где была найдена строка.
  • -r : Производит поиск рекурсивно по всем поддиректориям.

Раскраска grep.

Иногда удобно, когда искомое нами слово подсвечивается цветом.

Все это уже есть в grep, остается только включить. Для этого в команде можно использовать ключ —color=auto.

Пример:

grep --color=auto a /etc/mysql/my.cnf

Искомая буква «a» подсветится цветом.

Для того, чтобы не писать каждый раз такой длинный ключ — создадим псевдоним grep в файле ~/.bashrc (Применимо только к bash):

echo export GREP_OPTIONS=\'--color=auto\' >> ~/.bashrc

Теперь надо перечитать конфигурацию bash:

reset

Все, теперь подсветка искомого слова будет включена по умолчанию.

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

Регулярные выражения — мощный инструмент, используемый во многих утилитах Linux. grep — не исключение. С помощью этих выражений можно описать любую искомую строку.

С помощью «|» можно указать условие «или». В примере ниже grep выдаст все строки с вхождениями user или db. Для обработки подобных выражений необходимо использовать ключ -E или использовать egrep.

grep -E -i -w 'user|db' /etc/mysql/my.cnf

Символами ^ и $ мы можем указать местоположение искомого слова. ^ обозначает начало строки, $ — его конец.

Найдем все строки, начинющиеся на #

grep -i '^#' /etc/mysql/my.cnf

Теперь найдем все строки, заканчивающиеся на «!»

grep -i '!$' /etc/mysql/my.cnf

А теперь отобразим номера пустых строк:

grep -bi '^$' /etc/mysql/my.cnf

Поиск строк, содержащих цифру:

grep -i '[0-9]' /etc/mysql/my.cnf

Поиск строк с двумя цифрами подряд:

grep -i '[0-9][0-9]' /etc/mysql/my.cnf

Найдем все строки из двух символов:

grep '^..$' /etc/mysql/my.cnf

Как вы заметили, точка является спецсимволом. Для того, чтобы использовать точку и другие знаки в выражении, нам потребуется их экранировать символом \.

Например:

grep '\.' /etc/mysql/my.cnf

Экранировать знак \ можно самим собой:

grep '\\' /etc/mysql/my.cnf

Теперь попробуем найти все ip адреса, указанные в формате XXX.XXX.XXX.XXX

grep -E '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' /var/log/auth.log

Напоследок приведу маленькую таблицу с универсальными выражениями:

[[:alnum:]] -символы букв и цифр.
[[:alpha:]] - символы букв.
[[:blank:]] - space и tab.
[[:digit:]] - цифры: '0 1 2 3 4 5 6 7 8 9'.
[[:lower:]] - прописные буквы: 'a b c d e f g h i j k l m n o p q r s t u v w x y z'.
[[:space:]] - пустые символы: tab, newline, vertical tab, form feed, carriage return и space.
[[:upper:]] - заглавные буквы: 'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'.
comments powered by HyperComments