Следующая версия
|
Предыдущая версия
|
grep [2013/05/22 12:23] 46.231.215.230 создано |
grep [2013/05/22 16:29] (текущий) |
В своей основе grep предельно прост. Если вам нужно поискать что-то по шаблону в файле, воспользуйтесь командой: | В своей основе grep предельно прост. Если вам нужно поискать что-то по шаблону в файле, воспользуйтесь командой: |
| |
grep шаблон путь_к_файлу | grep шаблон путь_к_файлу |
1 | |
| |
grep шаблон путь_к_файлу | |
| |
Эта команда выполнит поиск по шаблону в указанном файле и выведет в стандартный поток вывода строки файла, искомый шаблон содержащие. | Эта команда выполнит поиск по шаблону в указанном файле и выведет в стандартный поток вывода строки файла, искомый шаблон содержащие. |
| |
Существует также очень распространённое применение grep — фильтрация потока вывода других программ. Давайте представим, например, что вам нужно получить список всех файлов, которые устанавливаются из пакета в каталог /usr/bin. В Debian-системах попробуйте команду: | Существует также очень распространённое применение grep — фильтрация потока вывода других программ. Давайте представим, например, что вам нужно получить список всех файлов, которые устанавливаются из пакета в каталог /usr/bin. В Debian-системах попробуйте команду: |
| |
dpkg-query -L packagename | grep "/usr/bin" | dpkg-query -L packagename | grep "/usr/bin" |
1 | |
| |
dpkg-query -L packagename | grep "/usr/bin" | |
| |
Для систем с RPM команда будет выглядеть так: | Для систем с RPM команда будет выглядеть так: |
| |
rpm -q --filesbypkg packagename | grep "/usr/bin" | |
1 | |
| |
rpm -q --filesbypkg packagename | grep "/usr/bin" | rpm -q --filesbypkg packagename | grep "/usr/bin" |
| |
Таким образом, вместо вывода полного списка всех файлов пакета, вы получите только те, которые предназначены для установки в каталог /usr/bin. Вы можете пойти дальше, и при помощи следующего перенаправления в grep, сузить результаты фильтрации. | Таким образом, вместо вывода полного списка всех файлов пакета, вы получите только те, которые предназначены для установки в каталог /usr/bin. Вы можете пойти дальше, и при помощи следующего перенаправления в grep, сузить результаты фильтрации. |
Выполняя поиск в файлах, grep умеет работать рекурсивно. Чтобы заставить grep работать таким образом, используйте опцию «-r». А по умолчанию grep будет искать только в файлах, находящихся в текущем каталоге. Таким образом, если вы запустите что-то вроде | Выполняя поиск в файлах, grep умеет работать рекурсивно. Чтобы заставить grep работать таким образом, используйте опцию «-r». А по умолчанию grep будет искать только в файлах, находящихся в текущем каталоге. Таким образом, если вы запустите что-то вроде |
| |
grep шаблон * | |
1 | |
| |
grep шаблон * | grep шаблон * |
| |
то grep будет искать только в файлах, находящихся в текущем каталоге, находясь в котором вы запустили команду. | то grep будет искать только в файлах, находящихся в текущем каталоге, находясь в котором вы запустили команду. |
Но если вы запустите | Но если вы запустите |
| |
grep -r шаблон * | |
1 | |
| |
grep -r шаблон * | grep -r шаблон * |
| |
то grep заботливо обойдёт все вложенные подкаталоги и поищет шаблон в файлах найденных подкаталогов. | то grep заботливо обойдёт все вложенные подкаталоги и поищет шаблон в файлах найденных подкаталогов. |
Само собой, вы можете комбинировать опции. Например, чтобы найти файлы, не содержащие строк, соответствующих шаблону можно использовать | Само собой, вы можете комбинировать опции. Например, чтобы найти файлы, не содержащие строк, соответствующих шаблону можно использовать |
| |
grep -v -l pattern * | |
1 | |
| |
grep -v -l pattern * | grep -v -l pattern * |
| |
Вам не нужны имена файлов в выводе grep, а интересны лишь строки — воспользуйтесь опцией «-h» и grep не будет выводить имена файлов. | Вам не нужны имена файлов в выводе grep, а интересны лишь строки — воспользуйтесь опцией «-h» и grep не будет выводить имена файлов. |
Используя эти опции, необходимо указать саму опцию и целое число, определяющее количество строк для вывода. Например | Используя эти опции, необходимо указать саму опцию и целое число, определяющее количество строк для вывода. Например |
| |
grep -C 2 pattern files | |
1 | |
| |
grep -C 2 pattern files | |
| |
| |
| grep -C 2 pattern files |
| |
выведет строки, в которых найдено соответствие, плюс 2 строки до 2 после каждой найденной. | выведет строки, в которых найдено соответствие, плюс 2 строки до 2 после каждой найденной. |
Регулярные выражения | Регулярные выражения |
Давайте немного рассмотрим регулярные выражения, которые, вероятно, вам пригодятся. В командной оболочке символ звёздочки «*» соответствует любому символу ноль или более раз. В grep символ «*» имеет несколько иное значение. В grep этот символ необходимо группировать с другими. Например, если вам нужен тот же эффект, как и в оболочке, используйте следующее: | Давайте немного рассмотрим регулярные выражения, которые, вероятно, вам пригодятся. В командной оболочке символ звёздочки «*» соответствует любому символу ноль или более раз. В grep символ «*» имеет несколько иное значение. В grep этот символ необходимо группировать с другими. Например, если вам нужен тот же эффект, как и в оболочке, используйте следующее: |
| |
grep '.*' pattern files | |
1 | |
| |
grep '.*' pattern files | grep '.*' pattern files |
| |
Если вам необходимо определить какой-то шаблон один и более раз, вы можете использовать конструкцию «+шаблон». | Если вам необходимо определить какой-то шаблон один и более раз, вы можете использовать конструкцию «+шаблон». |
Символ «^» соответствует началу строки, а символ «$» — её концу. Например, вы хотите найти все файлы с расширением «.html», но вам не нужны файлы с расширением «.html.bak»: | Символ «^» соответствует началу строки, а символ «$» — её концу. Например, вы хотите найти все файлы с расширением «.html», но вам не нужны файлы с расширением «.html.bak»: |
| |
ls | grep '.*html$' | ls | grep '.*html$' |
1 | |
| |
ls | grep '.*html$' | |
| |
Если вам необходимо, чтобы grep интерпретировала спецсивмолы как обычные — предварите их обратным слешем. Например | Если вам необходимо, чтобы grep интерпретировала спецсивмолы как обычные — предварите их обратным слешем. Например |
| |
grep '\*' filename | |
1 | |
| |
grep '\*' filename | grep '\*' filename |
| |
будет искать строки, содержащие символ звёздочки в filename. | будет искать строки, содержащие символ звёздочки в filename. |
В выражениях можно использовать диапазоны и классы символов. Для этого при составлении шаблона в grep используются квадратные скобки. Например, символу в диапазоне от A до Z будет соответствовать шаблон [A-Z]"", а любой цифре — [0-9]"". Также, используя квадратные скобки вы можете определять соответствие классам символов. Например, [:punct:]"" будет соответствовать любому знаку препинания. Например, чтобы найти строки, содержащие знаки препинания в конце, можно использовать следующую команду: | В выражениях можно использовать диапазоны и классы символов. Для этого при составлении шаблона в grep используются квадратные скобки. Например, символу в диапазоне от A до Z будет соответствовать шаблон [A-Z]"", а любой цифре — [0-9]"". Также, используя квадратные скобки вы можете определять соответствие классам символов. Например, [:punct:]"" будет соответствовать любому знаку препинания. Например, чтобы найти строки, содержащие знаки препинания в конце, можно использовать следующую команду: |
| |
grep '[[:punct:]]$' files | |
1 | |
| |
grep '[[:punct:]]$' files | grep '[[:punct:]]$' files |
| |
Обратите внимание на двойные скобки. Вообще, об использовании регулярных выражений в grep лучше всего проконсультируйтесь с её man-страницей. Поначалу, понимание того, что написано там, может даваться вам с некоторым трудом, однако не поленитесь, и вы сможете овладеть мощным инструментом — регулярными выражениями. | Обратите внимание на двойные скобки. Вообще, об использовании регулярных выражений в grep лучше всего проконсультируйтесь с её man-страницей. Поначалу, понимание того, что написано там, может даваться вам с некоторым трудом, однако не поленитесь, и вы сможете овладеть мощным инструментом — регулярными выражениями. |