Пример использования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
!!! Используйте -E для нормальной работы grep по шаблону grep шаблон путь_к_файлу - поиск в файле по шаблону grep "что" "Где" - искать в файле grep [0-9] /var/log/messages - отобрать и вывести строки содержащие цифровые символы из файла /var/log/messages grep ^Aug /var/log/messages - отобрать и вывести строки, начинающиеся с сочетания символов "Aug", из файла /var/log/messages grep Aug /var/log/messages - отобрать и вывести строки, содержащие сочетание символов "Aug" из файла /var/log/messages grep Aug -R /var/log/* - отобрать и вывести строки, содержащие сочетание символов "Aug", из всех файлов, расположенных в директории /var/log и ниже grep -nri 'foobar' * - найти по папкам данное слово и вывести номер строки и путь до файла grep -Er "что" * - искать что во всех файлах и каталогах grep -Eri "что" "Где" - искать что во всех файла и каталогах игнорируя регистр grep -ri "что_ищем" * - поиск в файлах "что_ищем" в текущем каталоге рекурсивно grep -riv "что_ищем" * - показать все файлы кроме "что_ищем" grep -v '^#' configfile | cat -s > nocomments - прочитать файл удалив строки с комментариями и сохранив в файл nocomments grep -irns "что_ищем" - будет искать начиная с текущего каталога, покажет имя файла и строку grep -nri 'foobar' * - найти по папкам данное слово и вывести номер строки и путь до файла grep -Er "что" * - искать что во всех файлах и каталогах grep -Eri "что" "Где" - искать что во всех файла и каталогах игнорируя регистр grep -r -i "что_ищем" * - поиск в файлах "что_ищем" в текущем каталоге рекурсивно grep -r -i -v "что_ищем" * - показать все файлы кроме "что_ищем" grep -v '^#' configfile | cat -s > nocomments - прочитать файл удалив строки с комментариями и сохранив в файл nocomments Рекурсивный поиск шаблона в группе файлов grep -R /way/to/*any/folder/ foo grep foo `ls -R /way/to/any*/folder/text.file` grep foo `find /way/to/*any/folder/ -name "text.file"` for file in /way/to/some/folder/text*.file; do grep foo $file; done Несколько фильтров И/ИЛИ: !!! благодаря пайп "|" , grep позволяет использовать несколько фильтров virsh list --all | grep -vE "Id|^$|---" - строки Id, пустые строки(^$) и исключить строки (---) cat config_filename | grep -vE "^#|^$" - смотрим конфиги без комментариев (^#) и пустых строк (^$) ls -la | grep -E "file1|file2" - показать file1 и file2 cat file | grep -iE "(one|two|three)" - отфильтровать строки без учёта регистра, содержащие одно из слов one, two, three |
Фильтрация потока вывода других программ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Давайте представим, например, что вам нужно получить список всех файлов, которые устанавливаются из пакета в каталог /usr/bin. В Debian-системах попробуйте команду: dpkg-query -L packagename | grep "/usr/bin" Для систем с RPM команда будет выглядеть так: rpm -q --filesbypkg packagename | grep "/usr/bin" Таким образом, вместо вывода полного списка всех файлов пакета, вы получите только те, которые предназначены для установки в каталог /usr/bin. Вы можете пойти дальше, и при помощи следующего перенаправления в grep, сузить результаты фильтрации. Как и всё в UNIX, grep по умолчанию чувствителен в регистру символов. Если вам это не подходит, просто добавьте опцию «-i» к вызову grep, после чего строки «ПОИСК» и «поиск» станут для неё равнозначными. |
Контекст:
1 2 3 4 5 6 7 8 9 10 11 |
В процессе поиска по лог-файлам часто нужно увидеть, в каком контексте найдено то или иное. По умолчанию grep выводит лишь строку, в которой было найдено совпадение, но есть несколько опций, позволяющих заставить grep выводить больше: «-A» (после контекста), «-B» (перед контекстом) и «-C» (контекст). Используя эти опции, необходимо указать саму опцию и целое число, определяющее количество строк для вывода. Например: grep -C 2 pattern files - выведет строки, в которых найдено соответствие, плюс 2 строки до 2 после каждой найденной. |
Шаблоны и регулярные выражения:
1 2 3 4 5 6 7 8 9 10 |
а* - a, ab, abc и aecjejich ^а - Любое «а», находящееся в начале строки *а$ - Любое «а», находящееся в конце строки а.с - Трех символьные строки, начинающиеся с «а» и заканчивающиеся на «с» [bcf]at - bat, cat или fat [a-d]at - aat, bat, cat, dat, но не Aat, Bat и т. д. [A-D]at - Aat, Bat, Cat и Dat, но не aat, bat и т. д. 1[3-5]7 - 137,147 и 157 \tHello - Символ табуляции, предшествующий слову hello \[tT][xX][Tt] - .txt, .TXT, .TxT или другие сочетания на основе изменения регистра |
Регулярные выражения подробней:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
grep может оказаться совершенно неиспользуемой в повседневной жизни, если вы собираетесь при помощи неё искать лишь какие-то конкретные последовательности символов. А как быть с тем, если вам нужно найти, например, только цифры или последовательность символов, в которую могут входить лишь определённые символы или их группы? Не проблема! Используя регулярные выражения в grep, вы получаете инструмент для решения чуть ли не любой задачи поиска. Давайте немного рассмотрим регулярные выражения, которые, вероятно, вам пригодятся. В командной оболочке символ звёздочки «*» соответствует любому символу ноль или более раз. В grep символ «*» имеет несколько иное значение. В grep этот символ необходимо группировать с другими. Например, если вам нужен тот же эффект, как и в оболочке, используйте следующее: grep '.*' pattern files Если вам необходимо определить какой-то шаблон один и более раз, вы можете использовать конструкцию «+шаблон». Символ «^» соответствует началу строки, а символ «$» — её концу. Например, вы хотите найти все файлы с расширением «.html», но вам не нужны файлы с расширением «.html.bak»: ls | grep '.*html$' Если вам необходимо, чтобы grep интерпретировала спецсимволы как обычные — предварите их обратным слешем. Например: grep '\*' filename - будет искать строки, содержащие символ звёздочки в filename. В выражениях можно использовать диапазоны и классы символов. Для этого при составлении шаблона в grep используются квадратные скобки. Например, символу в диапазоне от A до Z будет соответствовать шаблон [A-Z]"", а любой цифре — [0-9]"". Также, используя квадратные скобки вы можете определять соответствие классам символов. Например, [:punct:]"" будет соответствовать любому знаку препинания. Например, чтобы найти строки, содержащие знаки препинания в конце, можно использовать следующую команду: grep '[[:punct:]]$' files Обратите внимание на двойные скобки. Вообще, об использовании регулярных выражений в grep лучше всего проконсультируйтесь с её man-страницей. Поначалу, понимание того, что написано там, может даваться вам с некоторым трудом, однако не поленитесь, и вы сможете овладеть мощным инструментом — регулярными выражениями. |
Цвета
1 2 3 4 5 6 7 8 |
Зачастую в выводе grep трудновато бывает сразу же отыскать соответствующую шаблону часть строки. Чтобы упростить задачу визуального поиска среди результатов выдачи grep, вы можете попросить её использовать цвет для отметки совпадений. Просто добавьте опцию «--color=always» или «--color=auto»! Обратите внимание, что в некоторых дистрибутивах разработчики создают псевдоним для grep, включающий цвет по умолчанию. Например, в Linux Mint команда «grep» имеет псевдоним «grep --color=auto». Если у вас похожая ситуация, то используйте команду «grep --color=off» в случаях, когда вам не нужен «цветной» вывод. |