Примеры использования grep в Linux.

Сегодня я расскажу о возможностях утилиты grep. Изначально она появилась еще в UNIX и на данный момент является частью любого дистрибутива BSD, Mac OS, Linux. Предназначение ее — поиск строк согласно условию, описанному регулярным выражением.

Существуют модификации классического grep — egrep, fgrep, rgrep. Все они заточены под конкретные цели, при этом возможности grep перекрывают весь функционал.

Итак, посмотрим на утилиту поближе.

Самым простым примером использования команды является вывод строки, удовлетворяющей шаблону, из файла.

Например мы хотим найти строку, содержащую ‘user’ в файле /etc/mysql/my.cnf. Для этого воспользуемся следующей командой:

1
grep user /etc/mysql/my.cnf

Мы нашли нужную нам строку, но как потом найти ее в самом файле? Для этого мы добавим указание номера строки с помощью ключа -b.

1
grep -bi 'user' /etc/mysql/my.cnf

Ключ -i в примере выше делает наш поиск регистронезависимым.

Теперь давайте попробуем вывести содержимое этого конфига без комментариев:

1
grep -v '^#' /etc/mysql/my.cnf

Благодаря ключу -v мы исключаем строки с символом #. «^» означает, что «#» должна находиться в начале строки.

Ниже я привел пример команды, обрезающей комментарии всех видов, а также пустые строки:

1
grep -vE '^[[:blank:]]*#|^$'.

grep часто используется в связке с программными каналами (pipes) для обработки вывода других утилит.

Например команда

1
find /dev |grep sd

вернет список устройств, содержащих sd в названии.

Команда

1
find / |grep lala

вернет все файлы, имеющиеся в системе, содержащие в названии ‘lala’.

Раскраска grep.

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

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

Пример:

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

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

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

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

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

1
reset

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Например:

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

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

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

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

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

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

1
2
3
4
5
6
7
[[: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'.

На этом все, спасибо за внимание.

Linux  BSD  Mac 

Смотрите также

comments powered by Disqus