Добавил: 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