GREP

Материал из darklurker wiki
Перейти к: навигация, поиск

Базовый grep

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

grep user /etc/mysql/my.cnf

Поиск найденной строки в самом файле, добавляем указание номера строки с помощью ключа -b.

grep -bi 'user' /etc/mysql/my.cnf
ключ -i делает поиск регистронезависимым.


Вывод содержимого этого конфига без комментариев:

grep -v '^#' /etc/mysql/my.cnf
ключ -v исключает строки с символом #. «^» означает, что «#» должна находиться в начале строки.


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

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


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

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

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

Команда

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


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

Регулярные выражения — мощный инструмент, используемый во многих утилитах 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

Несколько шаблонов

cat /var/log/messages | grep -E -o '([0-9]{1,3}\.){3}[0-9]{1,3} //вывод всех IP-адресов(only) в логе, без -o ключа вывод строк с IP-адресами
cat /tmp/test | grep -E -o '([0-9]{1,3}\.){3}[0-9]{1,3}' | sort | uniq -c //вывод всех IP адресов с сортировкой и подсчетом уникальных

Таблица универсальных выражений

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'.