Разное

Grep bash примеры: Пять примеров использования grep

Содержание

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

Утилита grep — это очень мощное средство для поиска и фильтрации текстовой информации. В этой статье показаны несколько примеров ее использования, которые позволят по достоинству оценить ее возможности.
Основная сфера применения grep – поиск слов или фраз в файлах и потоках вывода. Вы можете осуществить поиск, набрав в командной строке запрос и область поиска (файл).
Например, чтобы найти строку “needle” в файле hystack.txt используйте следующую команду:

$ grep needle haystack.txt

В результате grep отобразит все вхождения needle, которые он встретит в содержимом файла haystack.txt. Важно заметить, что в этом случае grep ищет именно набор символов, а не слово. Например, будут отображены строки, включающие слово “needless” и другие слова, в которых встречается последовательность “needle”.

Чтобы указать grep, что вы ищете именно слово, используйте ключ -w. Этот ключ ограничит область поиска только указанным словом. Под словом подразумевается запрос, ограниченный с обоих сторон любыми пробельными символами, знаками пунктуации или переносами строки.

$ grep -w needle haystack.txt

Не обязательно ограничивать область поиска только одним файлом, grep может выполнять поиск и по группе файлов, причем в результатах поиска будет указан файл, в котором обнаружено совпадение. Ключ -n добавит еще и номер строки, в которой обнаружено совпадение, а ключ -r позволит выполнить рекурсивный поиск. Это очень удобно при поиске среди файлов с исходными текстами программ.

$ grep -rnw function_name /home/www/dev/myprogram/

Имя файла будет указано перед каждым совпадением. Если вам необходимо скрыть имена файлов, воспользуйтесь ключом -h, напротив, если необходимы только имена файлов, то укажите ключ -l
В следующем примере мы выполним поиск URL-адресов в лог-файле IRC и покажем последние 10 совпадений.

$ grep -wo http://.* channel.log | tail

Параметр -o указывает grep, что следует выводить лишь совпадение с шаблоном, а не всю строку. Вывод grep при помощи pipe перенаправляем команде tail, которая по умолчанию выводит 10 последних строк.
Теперь мы подсчитаем количество сообщений, посланных в irc-канал определенными пользователями. Например, все сообщения, которые я послал из дома и с работы. Они отличаются по никнейму, дома я использую ник user_at_home, а на работе user_at_work.

$ grep -c "^user_at_(home|work)" channel.log

С параметром -c grep выводит лишь количество найденных совпадений, а не сами совпадения. Строка поиска заключена в кавычки потому, что в ней содержатся специальные символы, которые могут распознаны оболочкой как управляющие. Обратите внимание, что кавычки не входят в шаблон поиска. Обратный слэш «» служит для экранирования служебных символов.
Выполним поиск по сообщениям людей, которые любят “кричать” в канале. Под “криком” мы понимаем сообщения, написанные в blondy-style, одними ЗАГЛАВНЫМИ буквами. Чтобы исключить из поиска случайные попадания аббревиатур, будем искать слова из пяти и более символов:

$ grep -w "[A-Z]+{5,}" channel.log

За более детальным описанием можно обратиться к странице руководства man grep.
Еще несколько примеров:

# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

Отображает строки из файла /etc/passwd, в которых есть строка root.

# grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
12:operator:x:11:0:operator:/root:/sbin/nologin

Отображаются, кроме того, номера строк, в которых есть искомая строка.

# grep -v bash /etc/passwd | grep -v nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
news:x:9:13:news:/var/spool/news:
mailnull:x:47:47::/var/spool/mqueue:/dev/null
xfs:x:43:43:X Font Server:/etc/X11/fs:/bin/false
rpc:x:32:32:Portmapper RPC user:/:/bin/false
nscd:x:28:28:NSCD Daemon:/:/bin/false
named:x:25:25:Named:/var/named:/bin/false
squid:x:23:23::/var/spool/squid:/dev/null
ldap:x:55:55:LDAP User:/var/lib/ldap:/bin/false
apache:x:48:48:Apache:/var/www:/bin/false

Проверяется, кто из пользователей не использует bash, исключая те аккаунты пользователей, у которых в качестве оболочки указан nologin.

# grep -c false /etc/passwd
7

Подсчитывает количество учетных записей, в которых в качестве командной оболочки указано /bin/false.

# grep -i games ~/.bash* | grep -v history

В этой команде отображаются строки из всех файлов домашнего каталога текущего пользователя, имена которых начинаются с ~/.bash, за исключением тех файлов, в именах которых есть строка history, с тем, чтобы исключить соответствия, имеющиеся в файле ~/.bash_history, в котором может быть указана одна и та же строка в верхнем или нижнем регистрах. Обратите внимание, что осуществляется поиск слова «games», вместо него можно подставить любое другое.
Команда grep и регулярные выражения

В отличие от предыдущего примера, теперь отобразим только те строки, которые начинаются со строки «root»:

# grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash

Если мы хотим увидеть, в каких учетных записях командная оболочка вообще не использовалась, мы ищем строки, заканчивающиеся сиволом «:»:

# grep :$ /etc/passwd
news:x:9:13:news:/var/spool/news:

Чтобы проверить, экспортируется ли в файле ~/.bashrc переменная PATH, сначала выберите строки с «export», а затем найдите строки, начинающиеся со строки «PATH»; в таком случае не будут отображаться MANPATH и другие возможные пути:

# grep export ~/.bashrc | grep 'PATH'
  export PATH="/bin:/usr/lib/mh:/lib:/usr/bin:/usr/local/bin:/usr/ucb:/usr/dbin:$PATH"

Символьные классы

Выражением в квадратных скобках является список символов, заключенных внутри символов [» и «]»». Оно соответствует любому одиночному символу, указанному в этом списке; если первый символ списка есть «^», то оно соответствует любому символу, который ОТСУТСВУЕТ в списке. Например, регулярное выражение [0123456789]»» соответствует любой одиночной цифре.

Внутри выражения в квадратных скобках можно указывать диапазон, состоящий из двух символов, разделенных дефисом. Тогда выражение соответствует любому одиночному, который согласно правилам сортировки попадает внутрь этих двух символов, включая и эти два символа; при этом учитывается последовательность упорядочивания и набор символов, указанные в локали. Например, когда по умолчанию указана локаль C, выражение [a-d]»» эквивалентно выражению [abcd]»». Есть много локалей, в которых сортировка выполняется в словарном порядке, и в этих локалях [a-d]»», как правило, не эквивалентно [abcd]»», в них, например, оно может быть эквивалентно выражению [aBbCcDd]»». Чтобы использовать традиционную интерпретацию выражения, указываемого в квадратных скобках, вы можете воспользоваться локалью C, установив для этого в переменной окружения LC_ALL значение «C».

Наконец, есть определенным образом поименованные символьные классы, которые указываются внутри выражений в квадратных скобках. Дополнительную информацию об этих предопределенных выражениях смотрите на страницах man или в документации команды grep.

# grep [yf] /etc/group
sys:x:3:root,bin,adm
tty:x:5:
mail:x:12:mail,postfix
ftp:x:50:
nobody:x:99:
floppy:x:19:
xfs:x:43:
nfsnobody:x:65534:
postfix:x:89:

В примере отображаются все строки, содержащие либо символ «y», либо символ «f».
Универсальные символы (метасимволы)

Используйте «.» для поиска соответствия любому одиночному символу. Если вы хотите получить список всех английских слов, взятых из словаря, содержащих пять символов, начинающихся с «c» и заканчивающихся «h» (удобно для решения кроссвордов):

# grep '<c...h>' /usr/share/dict/words
catch
clash
cloth
coach
couch
cough
crash
crush

Если вы хотите отобразить строки, в которых есть символ точки в виде литерала, то укажите в команде grep параметр -F. Символы «< » и «>» означают наличие пустой строки до и соответственно после указанных букв. Это значит, что слова в файл words должны быть записаны соответствующим образом. Если вы хотите найти все слова в тексте по указанному шаблоны без учета пустых строк опустите символы «< » и «>», для более точного поиска только слов используйте ключ -w.

Чтобы подобным образом найти слова, в которых между «c» и «h» может находиться любое число символов, используйте звездочку (*). В приведенном ниже примере из системного словаря выбираются все слова, начинающиеся с «c» и заканчивающиеся символом «h»:

# grep '<c.*h>' /usr/share/dict/words
caliph
cash
catch
cheesecloth
cheetah
--output omitted--

Если вы хотите найти в файле или в выходном потоке литеральный символ «звездочка», используйте для этого одинарные кавычки. Пользователь в приведенном ниже примере сначала пытается в файле /etc/profile найти «звездочку» без использования кавычек, в результате чего ничего не находится. Когда используются кавычки, в выходной поток выдается результат:

# grep * /etc/profile
# grep '*' /etc/profile
for i in /etc/profile.d/*.sh ; do

Читайте другие интересные статьи

Поиск внутри файлов в Linux

Иногда может понадобится найти файл, в котором содержится определённая строка или найти строку в файле, где есть нужное слово. В Linux всё это делается с помощью одной очень простой, но в то же время мощной утилиты grep. С её помощью можно искать не только строки в файлах, но и фильтровать вывод команд, и много чего ещё.

В этой инструкции мы рассмотрим, как выполняется поиск текста в файлах Linux, подробно разберём возможные опции grep, а также приведём несколько примеров работы с этой утилитой.

Содержание статьи:

Что такое grep?

Команда grep (расшифровывается как global regular expression print) — одна из самых востребованных команд в терминале Linux, которая входит в состав проекта GNU. Секрет популярности — её мощь, она даёт возможность пользователям сортировать и фильтровать текст на основе сложных правил.

Утилита grep решаем множество задач, в основном она используется для поиска строк, соответствующих строке в тексте или содержимому файлов. Также она может находить по шаблону или регулярным выражениям. Команда в считанные секунды найдёт файл в с нужной строчкой, текст в файле или отфильтрует из вывода только пару нужных строк. А теперь давайте рассмотрим, как ей пользоваться.

Синтаксис grep

Синтаксис команды выглядит следующим образом:

$ grep [опции] шаблон [имя файла…]

Или:

$ команда | grep [опции] шаблон

  • Опции — это дополнительные параметры, с помощью которых указываются различные настройки поиска и вывода, например количество строк или режим инверсии.
  • Шаблон — это любая строка или регулярное выражение, по которому будет вестись поиск
  • Файл и команда — это то место, где будет вестись поиск. Как вы увидите дальше, grep позволяет искать в нескольких файлах и даже в каталоге, используя рекурсивный режим.

Возможность фильтровать стандартный вывод пригодится,например, когда нужно выбрать только ошибки из логов или найти PID процесса в многочисленном отчёте утилиты ps.

Опции

Давайте рассмотрим самые основные опции утилиты, которые помогут более эффективно выполнять поиск текста в файлах grep:

  • -b — показывать номер блока перед строкой;
  • -c — подсчитать количество вхождений шаблона;
  • -h — не выводить имя файла в результатах поиска внутри файлов Linux;
  • -i — не учитывать регистр;
  • — l — отобразить только имена файлов, в которых найден шаблон;
  • -n — показывать номер строки в файле;
  • -s — не показывать сообщения об ошибках;
  • -v — инвертировать поиск, выдавать все строки кроме тех, что содержат шаблон;
  • -w — искать шаблон как слово, окружённое пробелами;
  • -e — использовать регулярные выражения при поиске;
  • -An — показать вхождение и n строк до него;
  • -Bn — показать вхождение и n строк после него;
  • -Cn — показать n строк до и после вхождения;

Все самые основные опции рассмотрели и даже больше, теперь перейдём к примерам работы команды grep Linux.

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

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

Поиск текста в файлах

В первом примере мы будем искать пользователя User в файле паролей Linux. Чтобы выполнить поиск текста grep в файле /etc/passwd введите следующую команду:

grep User /etc/passwd

В результате вы получите что-то вроде этого, если, конечно, существует такой пользователь:

User:x:1000:1000:User,,,:/home/User:/bin/bash

А теперь не будем учитывать регистр во время поиска. Тогда комбинации ABC, abc и Abc с точки зрения программы будут одинаковы:

grep -i "user" /etc/passwd

Вывести несколько строк

Например, мы хотим выбрать все ошибки из лог-файла, но знаем, что в следующей строчке после ошибки может содержаться полезная информация, тогда с помощью grep отобразим несколько строк. Ошибки будем искать в Xorg.log по шаблону «EE»:

grep -A4 "EE" /var/log/xorg.0.log

Выведет строку с вхождением и 4 строчки после неё:

grep -B4 "EE" /var/log/xorg.0.log

Выведет целевую строку и 4 строчки до неё:

grep -C2 "EE" /var/log/xorg.0.log

Выведет по две строки с верху и снизу от вхождения.

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

Регулярные выражения grep — очень мощный инструмент в разы расширяющий возможности поиска текста в файлах. Для активации этого режима используйте опцию -e. Рассмотрим несколько примеров:

Поиск вхождения в начале строки с помощью спецсимвола «^», например, выведем все сообщения за ноябрь:

grep "^Nov 10" messages.1

Nov 10 01:12:55 gs123 ntpd[2241]: time reset +0.177479 s
Nov 10 01:17:17 gs123 ntpd[2241]: synchronized to LOCAL(0), stratum 10

Поиск в конце строки — спецсимвол «$»:

grep "terminating.$" messages

Jul 12 17:01:09 cloneme kernel: Kernel log daemon terminating.
Oct 28 06:29:54 cloneme kernel: Kernel log daemon terminating.

Найдём все строки, которые содержат цифры:

grep "[0-9]" /var/log/Xorg.0.log

Вообще, регулярные выражения grep — это очень обширная тема, в этой статье я лишь показал несколько примеров. Как вы увидели, поиск текста в файлах grep становиться ещё эффективнее. Но на полное объяснение этой темы нужна целая статья, поэтому пока пропустим её и пойдем дальше.

Рекурсивное использование grep

Если вам нужно провести поиск текста в нескольких файлах, размещённых в одном каталоге или подкаталогах, например в файлах конфигурации Apache — /etc/apache2/, используйте рекурсивный поиск. Для включения рекурсивного поиска в grep есть опция -r. Следующая команда займётся поиском текста в файлах Linux во всех подкаталогах /etc/apache2 на предмет вхождения строки mydomain.com:

grep -r "mydomain.com" /etc/apache2/

В выводе вы получите:

grep -r "zendsite" /etc/apache2/
/etc/apache2/vhosts.d/zendsite_vhost.conf: ServerName zendsite.localhost
/etc/apache2/vhosts.d/zendsite_vhost.conf: DocumentRoot /var/www/localhost/htdocs/zendsite
/etc/apache2/vhosts.d/zendsite_vhost.conf: <Directory /var/www/localhost/htdocs/zendsite>

Здесь перед найденной строкой указано имя файла, в котором она была найдена. Вывод имени файла легко отключить с помощью опции -h:

grep -h -r "zendsite" /etc/apache2/

ServerName zendsite.localhost
DocumentRoot /var/www/localhost/htdocs/zendsite
<Directory /var/www/localhost/htdocs/zendsite>

Поиск слов в grep

Когда вы ищете строку abc, grep будет выводить также kbabc, abc123, aafrabc32 и тому подобные комбинации. Вы можете заставить утилиту искать по содержимому файлов в Linux только те строки, которые выключают искомые слова с помощью опции -w:

grep -w "abc" имя_файла

Поиск двух слов

Можно искать по содержимому файла не одно слово, а два сразу:

egrep -w 'word1|word2' /path/to/file

Количество вхождений строки

Утилита grep может сообщить, сколько раз определённая строка была найдена в каждом файле. Для этого используется опция -c (счетчик):

grep -c 'word' /path/to/file

C помощью опции -n можно выводить номер строки, в которой найдено вхождение, например:

grep -n 'root' /etc/passwd

Получим:

1:root:x:0:0:root:/root:/bin/bash

Инвертированный поиск в grep

Команда grep Linux может быть использована для поиска строк в файле, которые не содержат указанное слово. Например, вывести только те строки, которые не содержат слово пар:

grep -v пар /path/to/file

Вывод имени файла

Вы можете указать grep выводить только имя файла, в котором было найдено заданное слово с помощью опции -l. Например, следующая команда выведет все имена файлов, при поиске по содержимому которых было обнаружено вхождение primary:

grep -l 'primary' *.c

Цветной вывод в grep

Также вы можете заставить программу выделять другим цветом вхождения в выводе:

grep --color root /etc/passwd

Получится:

 

Выводы

Вот и всё. Мы рассмотрели использование команды grep для поиска и фильтрации вывода команд в операционной системе Linux. При правильном применении эта утилита станет мощным инструментом в ваших руках. Если у вас остались вопросы, пишите в комментариях!

Примеры команды grep в Linux

Иногда пользователи сталкиваются с необходимостью осуществления поиска определенной информации внутри каких-либо файлов. Часто конфигурационные документы или другие объемные данные вмещают в себе большое количество строк, поэтому вручную отыскать нужные данные не получается. Тогда на помощь приходит одна из встроенных команд в операционные системы на Linux, которая позволит выполнить нахождение строк буквально за считанные секунды.

Используем команду grep в Linux

Что касается различий между дистрибутивами Линукс, в этом случае они не играют никакой роли, поскольку интересующая вас команда grep по умолчанию доступна в большинстве сборок и применяется абсолютно одинаково. Сегодня мы бы хотели обсудить не только действие grep, но и разобрать основные аргументы, которые позволяют значительно упростить процедуру поиска.

Читайте также: Ищем файлы в Linux

Подготовительные работы

Все дальнейшие действия будут производиться через стандартную консоль, она же позволяет открывать файлы только путем указания полного пути к ним либо если «Терминал» запущен из необходимой директории. Узнать родительскую папку файла и перейти к ней в консоли можно так:

  1. Запустите файловый менеджер и переместитесь в нужную папку.
  2. Нажмите правой кнопкой мыши на требуемом файле и выберите пункт «Свойства».
  3. Во вкладке «Основные» ознакомьтесь со строкой «Родительская папка».
  4. Теперь запустите «Терминал» удобным методом, например, через меню или зажатием комбинации клавиш Ctrl + Alt + T.
  5. Здесь перейдите к директории через команду cd /home/user/folder, где user — имя пользователя, а folder — название папки.

Задействуйте команду cat + название файла, если хотите просмотреть полное содержимое. Детальные инструкции по работе с этой командой ищите в другой нашей статье по ссылке ниже.

Подробнее: Примеры команды cat в Linux

Благодаря выполнению приведенных выше действий вы можете использовать grep, находясь в нужной директории, без указания полного пути к файлу.

Стандартный поиск по содержимому

Прежде чем переходить к рассмотрению всех доступных аргументов, важно отметить и обычный поиск по содержимому. Он будет полезен в тех моментах, когда необходимо найти простое совпадение по значению и вывести на экран все подходящие строки.

  1. В командной строке введите grep word testfile, где word — искомая информация, а testfile — название файла. Когда производите поиск, находясь за пределами папки, укажите полный путь по примеру /home/user/folder/filename. После ввода команды нажмите на клавишу Enter.
  2. Осталось только ознакомиться с доступными вариантами. На экране отобразятся полные строки, а ключевые значения будут выделены красным цветом.
  3. Важно учитывать и регистр букв, поскольку кодировка Linux не оптимизирована для поиска без учета больших или маленьких символов. Если вы хотите обойти определение регистра, впишите grep -i "word" testfile.
  4. Как видите, на следующем скриншоте результат изменился и добавилась еще одна новая строка.

Поиск с захватом строк

Иногда пользователям необходимо найти не только точное совпадение по строкам, но и узнать информацию, которая идет после них, например, при отчете об определенной ошибке. Тогда правильным решением будет применить атрибуты. Впишите в консоль grep -A3 "word" testfile, чтобы включить в результат и три следующие строки после совпадения. Вы можете написать -A4, тогда будут захвачены четыре строки, ограничений никаких не имеется.

Если вместо -A вы примените аргумент -B + количество строк, в результате отобразятся данные, находящиеся до точки вхождения.

Аргумент , в свою очередь, захватывает строки вокруг ключевого слова.

Ниже вы можете увидеть примеры присваивания указанных аргументов. Обратите внимание, что обязательно нужно учитывать регистр и проставлять двойные кавычки.

grep -B3 "word" testfile
grep -C3 "word" testfile

Поиск ключевых слов в начале и в конце строк

Надобность определения ключевого слова, которое стоит в начале или в конце строки, чаще всего возникает во время работы с конфигурационными файлами, где каждая линия отвечает за один параметр. Для того чтобы увидеть точное вхождение в начале, необходимо прописать grep "^word" testfile. Знак ^ как раз и отвечает за применение этой опции.

Поиск содержимого в конце строк происходит примерно по такому же принципу, только в кавычках следует добавить знак $, и команда обретет такой вид: grep "word$" testfile.

Поиск чисел

При поиске нужных значений пользователь не всегда имеет информацию касательно точного слова, присутствующего в строке. Тогда процедуру поиска можно производить через числа, что иногда значительно упрощает задачу. Надо лишь задействовать рассматриваемую команду в виде grep "[0-7]" testfile, где «[0-7]» — диапазон значений, а testfile — название файла для сканирования.

Анализ всех файлов директории

Сканирование всех объектов, находящихся в одной папке, называется рекурсивным. Юзеру требуется применить только один аргумент, который проведен анализ всех файлов папки и выведет на экран подходящие строки и их расположение. Понадобится ввести grep -r "word" /home/user/folder, где /home/user/folder — путь к директории для сканирования.

Голубым цветом будет отображаться место хранения файла, а если хотите получить строки без этой информации, присвойте еще один аргумент, чтобы команда получилась такой grep -h -r "word" + путь к папке.

Точный поиск по словам

В начале статьи мы уже говорили об обычном поиске по словам. Однако при таком методе в результатах будут высвечиваться дополнительные комбинации. Например, вы находите слово User, но команда отобразит еще и User123, PasswordUser и другие совпадения, если такие имеются. Чтобы избежать такого результата, присвойте аргумент -w (grep -w "word" + имя файла или его расположение).

Выполняется эта опция и при надобности поиска сразу нескольких точных ключевых слов. В таком случае введите egrep -w 'word1|word2' testifile. Обратите внимание, что в этом случае к grep добавляется буква e, а кавычки ставятся одинарные.

Поиск строк без определенного слова

Рассматриваемая утилита умеет не только находить слова в файлах, но и выводить строки, в которых отсутствует заданное пользователем значение. Тогда перед введением ключевого значения и файла добавляется -v. Благодаря ей при активации команды вы увидите только соответствующие данные.

Синтаксис grep собрал в себе еще несколько аргументов, о которых можно вкратце рассказать:

  • -I — показывать только названия файлов, подходящих под критерий поиска;
  • -s — отключить уведомления о найденных ошибках;
  • -n — отображать номер строки в файле;
  • -b — показывать номер блока перед строчкой.

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

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

Читайте также: Часто используемые команды в «Терминале» Linux

Мы рады, что смогли помочь Вам в решении проблемы.

Опишите, что у вас не получилось.
Наши специалисты постараются ответить максимально быстро.

Помогла ли вам эта статья?

ДА НЕТ

15 практических примеров использования команды grep в Linux [RTFM.WIKI]

1. Search for the given string in a single file

The basic usage of grep command is to search for a specific string in the specified file as shown below.

Syntax:
grep "literal_string" filename
$ grep "this" demo_file
this line is the 1st lower case line in this file.
Two lines above this line is empty.
And this is the last line.

2. Checking for the given string in multiple files.

Syntax:
grep "string" FILE_PATTERN

This is also a basic usage of grep command. For this example, let us copy the demo_file to demo_file1. The grep output will also include the file name in front of the line that matched the specific pattern as shown below. When the Linux shell sees the meta character, it does the expansion and gives all the files as input to grep.

$ cp demo_file demo_file1

$ grep "this" demo_*
demo_file:this line is the 1st lower case line in this file.
demo_file:Two lines above this line is empty.
demo_file:And this is the last line.
demo_file1:this line is the 1st lower case line in this file.
demo_file1:Two lines above this line is empty.
demo_file1:And this is the last line.

3. Case insensitive search using grep -i

Syntax:
grep -i "string" FILE

This is also a basic usage of the grep. This searches for the given string/pattern case insensitively. So it matches all the words such as «the», «THE» and «The» case insensitively as shown below.

$ grep -i "the" demo_file
THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.
this line is the 1st lower case line in this file.
This Line Has All Its First Character Of The Word With Upper Case.
And this is the last line.

4. Match regular expression in files

Syntax:
grep "REGEX" filename

This is a very powerful feature, if you can use use regular expression effectively. In the following example, it searches for all the pattern that starts with «lines» and ends with «empty» with anything in-between. i.e To search «lines[anything in-between]empty» in the demo_file.

$ grep "lines.*empty" demo_file
Two lines above this line is empty.

From documentation of grep: A regular expression may be followed by one of several repetition operators:

  • ? The preceding item is optional and matched at most once.

  • * The preceding item will be matched zero or more times.

  • + The preceding item will be matched one or more times.

  • {n} The preceding item is matched exactly n times.

  • {n,} The preceding item is matched n or more times.

  • {,m} The preceding item is matched at most m times.

  • {n,m} The preceding item is matched at least n times, but not more than m times.

5. Checking for full words, not for sub-strings using grep -w

If you want to search for a word, and to avoid it to match the substrings use -w option. Just doing out a normal search will show out all the lines.

The following example is the regular grep where it is searching for «is». When you search for «is», without any option it will show out «is», «his», «this» and everything which has the substring «is».

$ grep -i "is" demo_file
THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.
this line is the 1st lower case line in this file.
This Line Has All Its First Character Of The Word With Upper Case.
Two lines above this line is empty.
And this is the last line.

The following example is the WORD grep where it is searching only for the word «is». Please note that this output does not contain the line «This Line Has All Its First Character Of The Word With Upper Case», even though «is» is there in the «This», as the following is looking only for the word «is» and not for «this».

$ grep -iw "is" demo_file
THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.
this line is the 1st lower case line in this file.
Two lines above this line is empty.
And this is the last line.

6. Displaying lines before/after/around the match using grep -A, -B and -C

When doing a grep on a huge file, it may be useful to see some lines after the match. You might feel handy if grep can show you not only the matching lines but also the lines after/before/around the match.

Please create the following demo_text file for this example.

$ cat demo_text
4. Vim Word Navigation

You may want to do several navigation in relation to the words, such as:

 * e - go to the end of the current word.
 * E - go to the end of the current WORD.
 * b - go to the previous (before) word.
 * B - go to the previous (before) WORD.
 * w - go to the next word.
 * W - go to the next WORD.

WORD - WORD consists of a sequence of non-blank characters, separated with white space.
word - word consists of a sequence of letters, digits and underscores.

Example to show the difference between WORD and word

 * 192.168.1.1 - single WORD
 * 192.168.1.1 - seven words.

6.1 Display N lines after match

-A is the option which prints the specified N lines after the match as shown below.

Syntax:
grep -A <N> "string" FILENAME

The following example prints the matched line, along with the 3 lines after it.

$ grep -A 3 -i "example" demo_text
Example to show the difference between WORD and word

* 192.168.1.1 - single WORD
* 192.168.1.1 - seven words.

6.2 Display N lines before match

-B is the option which prints the specified N lines before the match.

Syntax:
grep -B <N> "string" FILENAME

When you had option to show the N lines after match, you have the -B option for the opposite.

$ grep -B 2 "single WORD" demo_text
Example to show the difference between WORD and word

* 192.168.1.1 - single WORD

6.3 Display N lines around match

-C is the option which prints the specified N lines before the match. In some occasion you might want the match to be appeared with the lines from both the side. This options shows N lines in both the side(before & after) of match.

$ grep -C 2 "Example" demo_text
word - word consists of a sequence of letters, digits and underscores.

Example to show the difference between WORD and word

* 192.168.1.1 - single WORD

7. Highlighting the search using GREP_OPTIONS

As grep prints out lines from the file by the pattern / string you had given, if you wanted it to highlight which part matches the line, then you need to follow the following way.

When you do the following export you will get the highlighting of the matched searches. In the following example, it will highlight all the this when you set the GREP_OPTIONS environment variable as shown below.

$ export GREP_OPTIONS='--color=auto' GREP_COLOR='100;8'

$ grep this demo_file
this line is the 1st lower case line in this file.
Two lines above this line is empty.
And this is the last line.

8. Searching in all files recursively using grep -r

When you want to search in all the files under the current directory and its sub directory. -r option is the one which you need to use. The following example will look for the string «ramesh» in all the files in the current directory and all it’s subdirectory.

$ grep -r "ramesh" *

9. Invert match using grep -v

You had different options to show the lines matched, to show the lines before match, and to show the lines after match, and to highlight match. So definitely You’d also want the option -v to do invert match.

When you want to display the lines which does not matches the given string/pattern, use the option -v as shown below. This example will display all the lines that did not match the word «go».

$ grep -v "go" demo_text
4. Vim Word Navigation

You may want to do several navigation in relation to the words, such as:

WORD - WORD consists of a sequence of non-blank characters, separated with white space.
word - word consists of a sequence of letters, digits and underscores.

Example to show the difference between WORD and word

* 192.168.1.1 - single WORD
* 192.168.1.1 - seven words.

10. display the lines which does not matches all the given pattern.

Syntax:
grep -v -e "pattern" -e "pattern"
$ cat test-file.txt
a
b
c
d

$ grep -v -e "a" -e "b" -e "c" test-file.txt
d

11. Counting the number of matches using grep -c

When you want to count that how many lines matches the given pattern/string, then use the option -c.

Syntax:
grep -c "pattern" filename
$ grep -c "go" demo_text
6

When you want do find out how many lines matches the pattern

$ grep -c this demo_file
3

When you want do find out how many lines that does not match the pattern

$ grep -v -c this demo_file
4

12. Display only the file names which matches the given pattern using grep -l

If you want the grep to show out only the file names which matched the given pattern, use the -l (lower-case L) option.

When you give multiple files to the grep as input, it displays the names of file which contains the text that matches the pattern, will be very handy when you try to find some notes in your whole directory structure.

$ grep -l this demo_*
demo_file
demo_file1

13. Show only the matched string

By default grep will show the line which matches the given pattern/string, but if you want the grep to show out only the matched string of the pattern then use the -o option.

It might not be that much useful when you give the string straight forward. But it becomes very useful when you give a regex pattern and trying to see what it matches as

$ grep -o "is.*line" demo_file
is line is the 1st lower case line
is line
is is the last line

14. Show the position of match in the line

When you want grep to show the position where it matches the pattern in the file, use the following options as

Syntax:
grep -o -b "pattern" file
$ cat temp-file.txt
12345
12345

$ grep -o -b "3" temp-file.txt
2:3
8:3

Note: The output of the grep command above is not the position in the line, it is byte offset of the whole file.

15. Show line number while displaying the output using grep -n

To show the line number of file with the line matched. It does 1-based line numbering for each file. Use -n option to utilize this feature.

$ grep -n "go" demo_text
5: * e - go to the end of the current word.
6: * E - go to the end of the current WORD.
7: * b - go to the previous (before) word.
8: * B - go to the previous (before) WORD.
9: * w - go to the next word.
10: * W - go to the next WORD.

grep: коллекция примеров использования | proft.me

grep — утилита командной строки, используется для фильтрации текста по шаблону, в качестве шаблона могут быть регулярные выражения.

Для grep’а использую такой псевдоним

alias grep='egrep --color'

Основная разница между grep и egrep, в том что egrep понимает такие шаблоны поиска + ? |.

Таблица со временем будет дополнятся.

КомандаОписание
grep pattern file.txtпоиск pattern в файле file.txt, с выводом полностью совпавшей строкой
grep -o pattern file.txtпоиск pattern в файле file.txt и вывод только совпавшего куска строки
grep -i pattern file.txtигнорирование регистра при поиске
grep -bn pattern file.txtпоказать строку (-n) и столбец (-b), где был найден pattern
grep -v pattern file.txtинверсия поиска (найдет все строки, которые не совпадают с шаблоном pattern)
grep -A 3 pattern file.txtвывод дополнительных трех строк, после совпавшей
grep -B 3 pattern file.txtвывод дополнительных трех строк, перед совпавшей
grep -C 3 pattern file.txtвывод три дополнительные строки перед и после совпавшей
grep -r pattern $HOMEрекурсивный поиск по директории $HOME и всем вложенным
grep -c pattern file.txtподсчет совпадений
grep -L pattern *.txtвывести список txt-файлов, которые не содержат pattern
grep -l pattern *.txtвывести список txt-файлов, которые содержат pattern
grep -w pattern file.txtсовпадение только с полным словом pattern
grep -f patterns.txt file.txtпоиск по нескольким pattern из файла patterns.txt, шаблоны разделяются новой строкой
grep -I pattern file.txtигнорирование бинарных файлов
grep -v -f file2 file1 > file3вывод строк, которые есть в file1 и нет в file2
grep -in -e ‘python’ `find -type f`рекурсивный поиск файлов, содержащих слово python с выводом номера строки и совпадений
grep -inc -e ‘test’ `find -type f` | grep -v :0рекурсивный поиск файлов, содержащих слово python с выводом количества совпадений
grep . *.pyвывод содержимого всех py-файлов, предваряя каждую строку именем файла
grep «Http404» apps/**/*.pyрекурсивный поиск упоминаний Http404 в директории apps в py-файлах

Дополнительное чтиво

Команда grep — человеческий man — /dev/mem

Мануал по команде grep на человеческом языке.
Команда grep, одна из самых известных и употребительных команд Юниксовидных ОС, ведет свое начало от первого текстового редактора Юникс — ed.
Команда grep служит для поиска строк, содержащих заданный пользователем образец.
 
Наткнулся на замечательный проект Human — человеческий мануал. Те кто частенько обращаются с мануалам замечали, что многие из них написаны, чтобы только они были. Разработчику все понятно — и пользователь разберется. Вот и автор проекта решил перевести мануалы наиболее используемых программ на человеческий язык и надо сказать ему это удалось.
  Команда grep, одна из самых известных и употребительных команд Юниксовидных ОС, служит для поиска строк, содержащих заданный пользователем образец.

взято с: http://rus-linux.net/lib.php?name=MyLDP/consol/HuMan/grep-ru.html

Оригинал:
Автор: Алексей Дмитриев
Дата: 3 января 2009

 

Введение

Команда grep, одна из самых известных и употребительных команд Юниксовидных ОС, ведет свое начало от первого текстового редактора Юникс — ed. В этом редакторе была команда g/re/p (global/regular expression/print), которая и дала свое название новой программе.

Команда grep служит для поиска строк, содержащих заданный пользователем образец.

grep ОБРАЗЕЦ имя_файла

Причем обязательным для ввода является только ОБРАЗЕЦ, можно обойтись даже без имени файла (аргумента).

Команда grep без опций и аргумента.

Если не указано имени файла, то команда обрабатывает стандартный ввод, например строки, набранные на клавиатуре:

 

$ grep кот

у меня есть кошка,(Enter)
вернее это кот,(Enter)
вернее это кот,
который умеет(Enter)
который умеет
ловить мышей.(Enter)
(Ctrl+c)

В скобках показано, когда я нажимал клавишу Enter, чтобы перейти на новую строку. Одновременно, при нажатии Enter, программа выводила строки, содержащие ОБРАЗЕЦ (кот), отсюда и удвоение этих строк. Видно, что команда реагировала просто на сочетание букв, а не на слово «кот», иначе строка со словом «который» не попала бы в вывод.

Тут мы подошли к очень важному определению строки. Строкой команда grep (как и все остальные команды Юникс) считает все символы, находящиеся между двумя символами новой строки. Эти невидимые на экране символы возникают в тексте каждый раз, когда пользователь нажимает клавишу Enter. В Юниксовидных системах символ новой строки обозначается обратным слэшем с буквой n (n). Таким образом, строка может быть любого размера, начиная с одного символа и до многомегабайтного текста. И команда grep честно выведет эту строку, при условии, что она содержит ОБРАЗЕЦ.

Работа с файлами

Команда grep может обрабатывать любое количество файлов одновременно. Создадим три файла:

 

123.txt:     alice.txt:              ast.txt:

1234 Алиса очень Символ астериска
5678 красивая девочка, обозначается (*)
89*0 у нее такая ****** звездочкой.
длинная коса!

И дадим команду:

 

$ grep '*' 123.txt ast.txt alice.txt

123.txt:89*0
ast.txt:обозначается (*).
alice.txt:у нее такая ******

В выводе перечислены файлы, и указано, в каком из них какая строка содержит символ астериска. ОБРАЗЕЦ (*) пришлось взять в кавычки, чтобы командный интерпретатор понял, что имеется в виду символ, а не условный знак. Попробуйте без кавычек, увидите — ничего не получится.

Команда grep вовсе не ограничена одним выражением в качестве ОБРАЗЦА, можно задавать хоть целые фразы. Только их нужно заключать в кавычки (одинарные или двойные):

$ grep 'ная ко' 123.txt ast.txt alice.txt

alice.txt:длинная коса!

Возможности поиска при помощи команды grep могут быть значительно расширены применением групповых символов. Например, уже упоминавшийся астериск (звездочка) используется для представления любого символа или группы символов, если речь идет о тексте, и любого файла или группы файлов, если речь идет о директории.

Создадим директорию /example, в которую поместим файлы наших примеров: 123.txt, ast.txt, alice.txt и дадим команду:

$ grep '*' example/*

example/123.txt:89*0
example/alice.txt:у нее такая ******
example/ast.txt:обозначается (*)

То есть мы приказали просмотреть все файлы директории /example. Таким способом можно обследовать такие огромные директории как /usr, /dev, и любые другие.

Опция -r

—recursive

Еще больше увеличит зону поисков опция -r, которая заставит команду grep рекурсивно обследовать все дерево указанной директории, то есть субдиректории, субдиректории субдиректорий, и так далее вплоть до файлов. Например:

$ grep -r menu /boot


/boot/grub/grub.txt:Highlight the menu entry you want to edit and press 'e', then
/boot/grub/grub.txt:Press the [Esc] key to return to the GRUB menu.
/boot/grub/menu.lst:# GRUB configuration file '/boot/grub/menu.lst'.
/boot/grub/menu.lst:gfxmenu (hd0,3)/boot/message

Опция -i

—ignore-case

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

Опция -c

—count

Эта опция не выводит строки, а подсчитывает количество строк, в которых обнаружен ОБРАЗЕЦ. Например:

$ grep -c root /etc/group
8

То есть в восьми строках файла /etc/group встречается сочетание символов root.

Опция -n

—line-number

При использовании этой опции вывод команды grep будет указывать номера строк, содержащих ОБРАЗЕЦ:

$ grep -n print /etc/printcap

1:# /etc/printcap
3:# See "man printcap" for information on editing this file.
5:# In most cases it is better to use a tool to write the printcap
9:# cupsd print daemon at this URL: http://localhost:631

Опция -v

—invert-match

Выполняет работу, обратную обычной — выводит строки, в которых ОБРАЗЕЦ не встречается:

$ grep -v print /etc/printcap

#
#
# for you (at least initially), such as apsfilter
# (/usr/share/apsfilter/SETUP, used in conjunction with the
# LPRng lpd daemon), or with the web interface provided by the
# (if you use CUPS).

 

Опция -w

—word-regexp

Заставит команду grep искать только строки, содержащие все слово или фразу, составляющую ОБРАЗЕЦ. Например:

 

$ grep -w "длинная ко" example/*

Не дает вывода, то есть не находит строк, содержащих выражение «длинная ко». А вот команда:

 

$ grep -w "длинная коса" example/*

example/alice.txt:длинная коса!

находит точное соответствие в файле alice.txt.

Опция -x

—line-regexp

Еще более строгая. Она отберет только те строки исследуемого файла или файлов, которые полностью совпадают с ОБРАЗЦОМ.

 

$ grep -x "1234" example/*

example/123.txt:1234

Внимание: Мне попадались (на собственном компьютере) версии grep (например, GNU 2.5), в которых опция -x работала неадекватно. В то же время, другие версии (GNU 2.5.1) работали прекрасно. Если что-то не ладится с этой опцией, попробуйте другую версию, или обновите свою.

Опция -l

—files-with-matches

Команда grep с этой опцией не возвращает строки, содержащие ОБРАЗЕЦ, но сообщает лишь имена файлов, в которых данный образец найден:

$ grep -l 'Алиса' example/*

example/alice.txt

Замечу, что сканирование каждого из заданных файлов продолжается только до первого совпадения с ОБРАЗЦОМ.

Опция -L

—files-without-match

Наоборот, сообщает имена тех файлов, где не встретился ОБРАЗЕЦ:

$ grep -L 'Алиса' example/*

example/123.txt
example/ast.txt

Как мы имели случай заметить, команда grep, в поисках соответствия ОБРАЗЦУ, просматривает только содержимое файлов, но не их имена. А так часто нужно найти файл по его имени или другим параметрам, например времени модификации! Тут нам придет на помощь простейший программный канал (pipe). При помощи знака программного канала — вертикальной черты (|) мы можем направить вывод команды ls, то есть список файлов в текущей директории, на ввод команды grep, не забыв указать, что мы, собственно, ищем (ОБРАЗЕЦ). Например:

Desktop$ ls | grep grep

grep/
grep-ru.txt

Находясь в директории Desktop, мы «попросили» найти на Рабочем столе все файлы, в названии которых есть выражение «grep». И нашли одну директорию grep/ и текстовой файл grep-ru.txt, который я в данный момент и пишу.

Если мы хотим искать по другим параметрам файла, а не по его имени, то следует применить команду ls -l, которая выводит файлы со всеми параметрами:

Desktop$ ls -l | grep 2008-12-30

-rw-r--r-- 1 ya users 27 2008-12-30 08:06 123.txt
drwxr-xr-x 2 ya users 4096 2008-12-30 08:49 example/
-rw-r--r-- 1 ya users 11931 2008-12-30 14:59 grep-ru.txt

И вот мы получили список всех файлов, модифицированных 30 декабря 2008 года.

Команда grep незаменима при просмотре логов и конфигурационных файлов. Классически примером использования команды grep стал программный канал с командой dmesg. Команда dmesg выводит те самые сообщения ядра, которые мы не успеваем прочесть во время загрузки компьютера. Допустим, мы подключили через USB порт новый принтер, и теперь хотим узнать, как ядро «окрестило» его. Дадим такую команду:

$ dmesg | grep -i usb

Опция -i необходима, так как usb часто пишется заглавными буквами. Проделайте этот пример самостоятельно — у него длинный вывод, который не укладывается в рамки данной статьи.

Немного хитростей

Если продолжить описание множества опций команды grep, то статья станет утомительной и нечитаемой. Поэтому, рассмотрев необходимый минимум опций, можно развлечься всякими хитростями при применении этой замечательной команды.

Хитрость первая

Как заставить grep указать в выводе имя файла, где найдено соответствие ОБРАЗЦУ? Например, мы хотим найти строку, содержащую выражение «красивая девочка» в файле alice.txt, да так, чтобы в выводе фигурировало имя файла (для отчета). Если просто дать команду:

$ grep -w 'красивая девочка' alice.txt

красивая девочка,

То никакого имени файла там не будет. Но стоит добавить в аргументы еще один файл, как все заработает. Обычно, чтобы избежать неожиданностей, указывают файл /dev/null:

$ grep -w 'красивая девочка' alice.txt /dev/null

alice.txt:красивая девочка,

Хитрость вторая

Используя «чистые» опции команды grep, мы можем получить все строки, содержащие ОБРАЗЕЦ либо в составе других слов (без опций), либо в виде заданного слова (опция -w). А как найти слова, которые заканчиваются на -ОБРАЗЕЦ или начинаются с ОБРАЗЕЦ-? Для этого существуют специальные значки: , означающий, что ОБРАЗЕЦ будет концом слова.

$ grep 'kot' kot.txt

kot
kotoroe
antrekot
kotovasiya
okot
skotobaza
nekotoroe

Это был файл kot.txt целиком.

$ grep 'kot>' kot.txt

kot
antrekot
okot

А это были слова, оканчивающиеся на -kot.

$ grep '

kot
kotoroe
kotovasiya

Эти начинаются на kot-.

$ grep '' kot.txt

kot

А вот был «чистый» кот.

Прошу простить за транслитерацию, но с нашими буквами эта хитрость как-то не срабатывает, а с английскими словами не все поймут.

Хитрость третья.

Как быть, если ОБРАЗЕЦ начинается с дефиса, ведь команда примет его за опцию?

Попробуем:

$ grep  '--анонимность' anonim.txt

grep: unrecognized option `--анонимность'

Так и есть — принимает за опцию. Ну так дадим ей опцию -e, которая означает: «Воспринимать ОБРАЗЕЦ только как образец».

$ grep -e '--анонимность' anonim.txt

--анонимность

Совсем другое дело.

Хитрость четвертая.

Как посмотреть соседние строчки?

$ grep -C 2 -e  '--анонимность' anonim.txt

Требуется соблюсти следующие условия:
--анонимность
--секретность
--неразглашение.

Просмотр вверх и вниз на две строки.

$ grep -A 1 -e  '--анонимность' anonim.txt

--анонимность
--секретность

Просмотр вниз на одну строку.

$ grep -B 1 -e  '--анонимность' anonim.txt

Требуется соблюсти следующие условия:
--анонимность

Просмотр вверх на одну строку.

Хитрость пятая.

$ grep -r menu /boot

Бинарный файл /boot/grub/stage2 совпадает
Бинарный файл /boot/grub/stage2_eltorito совпадает
/boot/grub/grub.txt:Highlight the menu entry you want to edit and press 'e', then
/boot/grub/grub.txt:Press the [Esc] key to return to the GRUB menu.
/boot/grub/menu.lst:# GRUB configuration file '/boot/grub/menu.lst'.
/boot/grub/menu.lst:gfxmenu (hd0,3)/boot/message

Что означают сообщения в первых двух строках вывода?

Сообщение «Бинарный файл совпадает» («Binary file matches») появляется, когда совпадение с образцом встречается в бинарных файлах. Если бы grep вывел строки из таких файлов на дисплей, толку было бы немного, а на дисплее могла возникнуть неразбериха (а может быть, и чего похуже, если драйвер терминала воспримет какие-либо фрагменты бинарного файла как команды). Если вы хотите все-таки увидеть эти строки, то применяйте опцию -a или —binary-files=text. Если хотите подавить вывод сообщений «Бинарный файл совпадает», то применяйте опцию -I или —binary-files=without-match.

Хитрость шестая.

Как искать строки, содержащие несколько ОБРАЗЦОВ?

Применить программный канал, канализируя вывод одной команды grep с вводом следующей команды grep.

$ grep 'у' example/* | grep '*'

example/alice.txt:у нее такая ******

Первый grep ищет у нас «у», а второй — «*» и оба находят искомое в одной строке: «у нее такая ******». Можно сделать эту цепочку команд grep любой длины, было бы чего искать, да строчки достаточно длинные 🙂

Хитрость седьмая, и пока последняя.

Можно ли искать одновременно в стандартном вводе и в файле?. Можно, если перед именем файла поставить дефис:

$ echo многие употребляют астериск неправильно | grep 'астериск' - example/*

(стандартный ввод):многие употребляют астериск неправильно
example/ast.txt:Символ астериска

Внимание: Если перед дефисом и после него не будет пробелов, то команда не сработает.

Но настало время вернуться к опциям команды grep.

Пока я занимался хитростями, успел позабыть, какие из опций уже описал, а какие нет. Поэтому я дал команду:

 

$ grep 'Опция' grep-ru.txt > option.txt

и получил файл option.txt, в котором перечислены все фигурирующие в файле grep-ru.txt опции.

Общее количество опций программы подавляет, поэтому пойдем по алфавиту, пропуская те, что я уже описал.

Опция -f имя_файла

—file=имя_файла

Весьма полезная опция, когда нужно искать несколько ОБРАЗЦОВ, причем не в одной строке, как мы делали в шестой Хитрости, а в разных. Для того чтобы воспользоваться этой опцией, нужно составить файл, в котором поместить искомые ОБРАЗЦЫ по одному на строчке:

pattern.txt:

nobody
root
ya

А затем дать команду:

# grep -f pattern.txt /etc/passwd

nobody:x:65534:65533:nobody:/var/lib/nobody:/bin/bash
root:x:0:0:root:/root:/bin/bash
ya:x:1000:100:alex dmitriev:/home/ya:/bin/bash

Предупреждение: Эта полезная опция, к сожалению, работает не на всех версиях grep. На версии GNU grep 2.5 работает неадекватно, а на GNU grep 2.5.1 — прекрасно. Так что обновляйтесь, господа. Текущая стабильная версия GNU grep — 2.5.3.

Опция -o

—only-matching

Возвращает не всю строку, где найдено соответствие ОБРАЗЦУ, а только совпадающую с ОБРАЗЦОМ часть строки.

Без опции -o:

 

$ grep 'английскими' grep-ru.txt

Прошу простить за транслитерацию, но с нашими буквами как-то эта хитрость не срабатывает,
а с английскими словами не все поймут.

А вот с опцией -o:

$ grep -o 'английскими' grep-ru.txt

английскими

Опция -q

—quiet —silent

Ничего не выдает на стандартный вывод. В случае нахождения соответствия с ОБРАЗЦОМ немедленно отключается с нулевым статусом. Отключается также при обнаружении ошибки. Для чего это — не знаю. У меня получалось, что программа мгновенно прекращает работу, есть ли совпадения, нет ли, без всяких сообщений, в том числе и о нулевом статусе. Опробовал обе доступные версии grep.

Опция -s

—no-messages

Подавляет сообщения о несуществующих или нечитаемых файлах.

Предупреждение: традиционные версии последних двух опции (-q и -s) не соответствуют стандарту POSIX.2 и не совпадают с GNU версиями. Поэтому их нельзя применять в скриптах для командной оболочки. Просто перенаправляйте вывод на /dev/null.

Опции — расширения GNU

Опции
-A —after-context=ЧИСЛО_СТРОК
-B —before-context=ЧИСЛО_СТРОК
-C —context=ЧИСЛО_СТРОК

С этими тремя опциями мы уже познакомились в четвертой Хитрости, они позволяют посмотреть соседние строки. -A: количество строк после совпадения с ОБРАЗЦОМ, -B: количество строк перед совпадением, и -C: количество строк вокруг совпадения.

 

Опция —colour[=КОГДА]

Выделяет найденные строки цветом. Значения КОГДА могут быть: never (никогда), always (всегда), или auto. Пример:

 

$ grep -o 'английскими' --color grep-ru.txt

английскими

Опция -D ДЕЙСТВИЕ

—devices=ДЕЙСТВИЕ

Если исследуемый файл является файлом устройства, FIFO (именованным каналом) или сокетом, то следует применять эту опцию. ДЕЙСТВИЙ всего два: read (прочесть), и skip (пропустить). Если вы указываете ДЕЙСТВИЕ read (используется по умолчанию), то программа попытается прочесть специальный файл, как если бы он был обычным файлом; если указываете ДЕЙСТВИЕ skip, то файлы устройств, FIFO и сокеты будут молча проигнорированы.

Опция -d ДЕЙСТВИЕ

—directories=ДЕЙСТВИЕ

Если входной файл является директорией, то используйте эту опцию. ДЕЙСТВИЕ read (прочесть) попытается прочесть директорию как обычный файл (некоторые ОС и файловые системы запрещают это; тогда появятся соответствующие сообщения, либо директории молча пропустят). Если ДЕЙСТВИЕ skip (пропустить), то директории будут молча проигнорированы. Если ДЕЙСТВИЕ recurse (рекурсивно), то grep будет просматривать все файлы и субдиректории внутри заданного каталога рекурсивно. Это эквивалент опции -r, с которой мы уже познакомились.

Опция -H

—with-filename

Выдает имя файла для каждого совпадения с ОБРАЗЦОМ. Мы успешно делали это без всяких опций в Хитрости второй.

Опция -h

—no-filename

Подавляет вывод имен файлов, когда задано несколько файлов для исследования.

Опция -I

Обрабатывает бинарные файлы как не содержащие совпадений с ОБРАЗЦОМ; эквивалент опции —binary-files=without-match.

Опция —include=ОБРАЗЕЦ_имени_файла

При рекурсивном исследовании директорий обследовать только файлы, содержащие в своем имени ОБРАЗЕЦ_имени_файла.

Опция —exclude=ОБРАЗЕЦ_имени_файла

При рекурсивном исследовании директорий пропускать файлы, содержащие в своем имени ОБРАЗЕЦ_имени_файла.

Опция -m ЧИСЛО_СТРОК

—max-count=ЧИСЛО_СТРОК

Прекратить обработку файла после того, как количество совпадений с ОБРАЗЦОМ достигнет ЧИСЛА_СТРОК:

$ grep -m 2 'kot' kot.txt

kot
kotoroe

 

Опция -y

Синоним опции -i (не различать верхний и нижний регистр символов).

Опции -U и -u применяются только под MS-DOS и MS-Windows, тут нечего о них говорить.

Опция —mmap

Использует системный вызов mmap вместо системного вызова read. Может дать лучшую производительность, а может привести к ошибкам. Это для продвинутых пользователей.

Опция -Z

—null

Если в выводе программы имена файлов (например при опции -l), то опция -Z после каждого имени файла выводит нулевой байт вместо символа новой строки (как обычно происходит). Это делает вывод однозначным, даже если имена файлов содержат символы новой строки. Эта опция может быть использована совместно с такими командами как: find -print0, perl -0, sort -z, xargs -0 для обработки файловых имен, составленных необычно, даже содержащих символы новой строки. (Хотел бы я знать, как можно включить символ новой строки в имя файла. Если кто знает, не поленитесь — сообщите мне.)

Опция -z

—null-data

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

Команда grep и регулярные выражения

Регулярные выражения (Regular Expressions) это система синтаксического разбора текстовых фрагментов по формализованному шаблону, основанная на системе записи ОБРАЗЦОВ для поиска. Проще говоря, регулярное выражение — тот же, уже привычный нам ОБРАЗЕЦ для поиска, только составленный по определенным правилам. Как математические формулы составляются при помощи набора операторов (плюс, минус, степень, корень и прочее), так и регулярные выражения конструируются при помощи различных операторов (?, *, +, {n} и прочие).

Тема регулярных выражений настолько обширна, что требует для своего освещения отдельной статьи; в данной статье мы не будем ее подробно разбирать. Скажу лишь, что существует несколько версий синтаксиса регулярных выражений: Базовый (basic) BRE, Расширенный (extended) ERE и регулярные выражения языка Perl.

Опция -G

—basic-regexp

Рассматривает ОБРАЗЕЦ как базовое регулярное выражение. Эта опция используется по умолчанию.

Опция -E

—extended-regexp

Рассматривает ОБРАЗЕЦ как расширенное регулярное выражение.

Опция -P

—perl-regexp

Рассматривает ОБРАЗЕЦ как регулярное выражение языка Perl.

Опция -F

—fixed-strings

Рассматривает ОБРАЗЕЦ как список «фиксированных выражений» (fixed strings — термин из области регулярных выражений), разделенных символами новой строки. Будет искать соответствия любому из них.

Кроме того, существуют две альтернативные команды EGREP и FGREP. Обе они соответствуют опциям -E и -F соответственно.

Опции —help и —version (-V) общеизвестны, и я не буду на них останавливаться.

Команда grep и символы кириллицы.

Читая эту статью, вы не могли не заметить, что большинство примеров составлено на русском языке. Я еще не встречал консольных команд, столь хорошо «владеющих русским». Теперь, когда я разобрался с этой командой, то уже не понимаю, как мог обходиться без нее при написании статей (по-русски, разумеется). Лишь некоторые опции «дают прокол» при обработке символов кириллицы.

Резюме команды grep

Команда grep настолько полезна, многофункциональна и проста в употреблении, что, однажды познакомившись с ней, невозможно представить себе работу без нее. Особенно полезна эта команда в качестве фильтра в составе программных каналов (pipes).

Примеры использования 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) для обработки вывода других утилит.

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

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

Команда

вернет все файлы, имеющиеся в системе, содержащие в названии ‘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\' &gt;&gt; ~/.bashrc

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

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

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

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

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


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

30 примеров Grep — подсказка для Linux

Вы можете найти grep глубоко внутри животного мозга Unix и Unix-подобных операционных систем. Это базовая программа, используемая для сопоставления с образцом, она была написана в 70-х вместе с остальной частью инструмента UNIX, который мы знаем и любим (или ненавидим).

Хотя изучение формальных языков и регулярных выражений — это увлекательная тема. Изучение grep — это гораздо больше, чем регулярные выражения. Чтобы начать работу с ним и увидеть красоту и элегантность grep, вам сначала нужно увидеть несколько реальных примеров.

Примеры, которые удобны и сделают вашу жизнь немного проще. Вот 30 таких распространенных вариантов использования и параметров grep.

1. пс доп. | grep <шаблон>

ps aux перечисляет все процессы и связанные с ними pid. Но часто этот список слишком длинный, чтобы человек мог его изучить. Передавая вывод в команду grep, вы можете перечислить процессы, запущенные с учетом очень конкретного приложения. Например, может быть sshd, nginx или httpd.

# ps aux | grep sshd
корень 400 0.0 0,2 69944 5624? СС 17:47 0:00 / usr / sbin / sshd -D
корень 1076 0,2 0,3 95204 6816? Ss 18:29 0:00 sshd: root @ pts / 0
root 1093 0,0 0,0 12784 932 точки / 0 S + 18:29 0:00 grep sshd

2. Получение IP-адресов

В большинстве операционных систем вы можете перечислить все свои сетевые интерфейсы и IP, назначенный этому интерфейсу, с помощью команды ifconfig или ip addr. Обе эти команды выведут много дополнительной информации.Но если вы хотите распечатать только IP-адрес (например, для сценариев оболочки), вы можете использовать следующую команду:

$ ip адрес | grep inet | awk ‘{print $ 2; } ‘
$ ip addr | grep -w inet | awk ‘{print $ 2; } ‘# Для строк только с inet, а не с inet6 (IPv6)

Команда ip addr получает все подробности (включая IP-адреса), затем она передается второй команде grep inet, которая выводит только строки с inet в них. Затем он передается в awk print оператор, который печатает второе слово в каждой строке (проще говоря).

P.S: Вы также можете сделать это без grep, если вы хорошо знаете awk.

3. Анализ неудачных попыток SSH

Если у вас есть сервер с выходом в Интернет с общедоступным IP-адресом, он будет постоянно подвергаться атакам SSH, и если вы разрешите пользователям иметь доступ к SSH на основе пароля (политика, которую я бы не рекомендовал), вы можете увидеть все такие неудачные попытки, используя следующую команду grep:

# cat /var/log/auth.log | grep «Fail»
Sample out put
Dec 5 16:20:03 debian sshd [509]: неверный пароль для root от 192.168.0.100 порт 52374 ssh3
5 декабря 16:20:07 debian sshd [509]: неверный пароль для root от порта 192.168.0.100 52374 ssh3
5 декабря 16:20:11 debian sshd [509]: неверный пароль для root от 192.168.0.100 порт 52374 ssh3

4. Подключение Grep к Uniq

Иногда grep выводит много информации. В приведенном выше примере, возможно, один IP-адрес пытался войти в вашу систему. В большинстве случаев существует лишь несколько таких оскорбительных IP-адресов, которые нужно однозначно идентифицировать и занести в черный список.

# cat /var/log/auth.log | grep «Ошибка» | uniq -f 3

Команда uniq должна печатать только уникальные строки. Uniq -f 3 пропускает первые три поля (чтобы пропустить отметки времени, которые никогда не повторяются), а затем начинает поиск уникальных строк.

5. Grepping для сообщений об ошибках

Использование Grep для доступа и журналов ошибок не ограничивается только SSH. Веб-серверы (например, Nginx) очень тщательно регистрируют ошибки и обращаются к журналам. Если вы настроили сценарии мониторинга, которые отправляют вам предупреждения, когда grep «404» возвращает новое значение.Это может быть весьма полезно.

# grep -w «404» /var/www/nginx/access.log

192.168.0.100 — — [06 / Dec / 2018: 02: 20: 29 +0530] «GET /favicon.ico HTTP / 1.1» 404 200
«http://192.168.0.102/» «Mozilla / 5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit / 537.36 (KHTML, например Gecko) Chrome / 70.0.3538.110 Safari / 537.36″

192.168.0.101 — — [06 / Dec / 2018: 02: 45: 16 +0530] «GET /favicon.ico HTTP / 1.1» 404 143
«http://192.168.0.102/» «Mozilla / 5.0 (iPad; CPU OS 12_1, например Mac OS X)
AppleWebKit / 605.1.15 (KHTML, как Gecko) Версия / 12.0 Mobile / 15E148 Safari / 604.1 «

Регулярным выражением может быть не «404», а какая-то другая фильтрация регулярных выражений только для мобильных клиентов или только для устройств Apple, просматривающих веб-страницу. Это позволяет глубже понять, как работает ваше приложение.

6. Листинг пакета

Для систем на основе Debian dpkg -l перечисляет все пакеты, установленные в вашей системе. Вы можете передать это в команду grep для поиска пакетов, принадлежащих определенному приложению.Например:

7. grep -v <шаблон> имена файлов

Чтобы перечислить все строки, в которых не содержат заданный шаблон, используйте флаг -v. По сути, это противоположность обычной команды grep.

8. grep -l <шаблон>

В нем перечислены все файлы, содержащие хотя бы одно вхождение указанного шаблона. Это полезно, когда вы ищете шаблон внутри каталога с несколькими файлами. Он печатает только имя файла, а не конкретную строку с шаблоном.

9. Параметр одного слова -w

$ grep -w <ШАБЛОН> имена файлов

Флаг -w указывает grep искать данный шаблон как целое слово, а не только подстроку строки. Например, ранее мы искали IP-адрес, и шаблон inet напечатал строки с inet и inet6 , в которых перечислены адреса IPv4 и IPv6. Но если мы использовали флаг -w, только строки с inet в качестве слова с предшествующим и последующим пробелами — допустимое совпадение.

10. Расширенное регулярное выражение

Вы часто обнаруживаете, что собственные регулярные выражения Grep немного ограничивают. В большинстве сценариев и инструкций вы найдете использование флага -E, который позволит вам ввести шаблон в так называемом расширенном режиме.

Вот команды grep и grep -E для поиска слов Супермен и Человек-паук.

$ grep «\ (Super | Spider \) man» text
$ grep -E «(Super | Spider) man» text

Как видите, расширенную версию читать намного проще.

11. Grep для ваших контейнеров

Если на вашем хосте работает большой кластер контейнеров, вы можете найти их по имени образа, статусу, портам, которые они открывают, и многим другим атрибутам. Например,

$ докер ps | grep [imageName]

12. Grep для стручков

Пока мы в теме контейнеров. Kubernetes часто запускает несколько модулей в рамках одного развертывания. Хотя каждый модуль имеет уникальное имя, в заданном пространстве имен они обычно начинаются с имени развертывания.Мы можем найти это и перечислить все модули, связанные с данным развертыванием.

$ kubectl получить стручки | grep <имя развертывания>

13. Grep для больших данных

Часто так называемый анализ «больших данных» включает простой поиск, сортировку и подсчет шаблонов в заданном наборе данных. Утилиты UNIX низкого уровня, такие как grep, uniq, wc, особенно хороши в этом. Это сообщение в блоге показывает хороший пример задачи, выполненной за считанные секунды с использованием grep и других утилит Unix, в то время как Hadoop занял почти полчаса.

Например, размер этого набора данных превышает 1,7 ГБ. Он содержит информацию о множестве шахматных матчей, включая сделанные ходы, кто выиграл и т. Д. Нас интересуют только результаты, поэтому мы запускаем следующую команду:

$ grep «Результат» Millionbase-2.22.pgn | сортировать | uniq -c
221 [Результат «*»]
653728 [Результат «0-1»]
852305 [Результат «1-0»]
690934 [Результат «1 / 2-1 / 2»]

Это заняло около 15 секунд на 2-ядерном / 4-поточном процессоре 4-летней давности.Так что в следующий раз, когда вы будете решать проблему «больших данных». Подумайте, можете ли вы вместо этого использовать grep.

14. grep –color = auto

Эта опция позволяет grep выделять шаблон внутри строки, где он был найден.

15. grep -i <ШАБЛОН>

Сопоставление с образцом Grep по своей природе чувствительно к регистру. Но если вас это не волнует, то использование флага -i сделает grep нечувствительным к регистру.

16. grep -n

Флаг -n покажет номера строк, поэтому вам не нужно беспокоиться о том, чтобы позже найти ту же строку.

17. git grep

Git, система управления версиями, сама имеет встроенную команду grep, которая работает почти так же, как ваш обычный grep. Но его можно использовать для поиска шаблонов в любом зафиксированном дереве с помощью собственного интерфейса командной строки git вместо утомительных каналов. Например, если вы находитесь в главной ветке своего репо, вы можете использовать grep для репо, используя:

(мастер) $ git grep <шаблон>

18. grep -o <ШАБЛОН>

Флаг -o действительно полезен, когда вы пытаетесь отладить регулярное выражение.Он напечатает только соответствующую часть строки, а не всю строку. Итак, в случае, если вы получаете слишком много нежелательных линий для предоставленного шаблона, и вы не можете понять, почему это происходит. Вы можете использовать флаг -o, чтобы распечатать ошибочную подстроку и рассуждать о своем регулярном выражении в обратном порядке.

19. grep -x <ШАБЛОН>

Флаг -x выводит строку, если и только если вся строка соответствует вашему регулярному выражению. Это в некоторой степени похоже на флаг -w, который печатал строку, если и только целое слово соответствовало предоставленному регулярному выражению.

20. grep -T <ШАБЛОН>

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

21. grep -q <ШАБЛОН>

Это подавляет вывод и незаметно запускает команду grep. Очень полезно при замене текста или запуске grep в сценарии демона.

22. grep -P <ШАБЛОН>

Люди, которые привыкли к синтаксису регулярных выражений Perl, могут использовать флаг -P, чтобы использовать именно это. Вам не нужно изучать базовые регулярные выражения, которые grep использует по умолчанию.

23. grep -D [ДЕЙСТВИЕ]

В Unix почти все можно рассматривать как файл. Следовательно, в grep можно передать любое устройство, сокет или поток данных FIFO. Вы можете использовать флаг -D, за которым следует ACTION (действие по умолчанию — READ). Еще несколько вариантов: ПРОПУСТИТЬ, чтобы незаметно пропустить определенные устройства, и РЕКУРС, чтобы рекурсивно пройти через каталоги и символические ссылки.

24. Повтор

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

$ grep -E «[0-9] {10}»

Печатает строки, содержащие строки длиной 10 или более цифр.

25. Повторение сокращений

Некоторые специальные символы зарезервированы для определенного вида повторения шаблона. Вы можете использовать их вместо фигурных скобок, если они вам подходят.

? : Шаблон перед вопросительным знаком должен соответствовать нулю или одному разу.

*: шаблон перед звездочкой должен совпадать ноль или более раз.

+: шаблон, предшествующий плюсу, должен совпадать один или несколько раз.

25. Смещения байтов

Если вы хотите видеть байтовое смещение строк, в которых найдено совпадающее выражение, вы также можете использовать флаг -b для печати смещений. Чтобы напечатать смещение только соответствующей части строки, вы можете использовать флаг -b с флагом -o.

$ grep -b -o <ШАБЛОН> [имя файла]

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

26. egrep, fgrep и rgerp

Вы часто будете видеть вызов egrep для использования расширенного синтаксиса регулярных выражений, который мы обсуждали ранее. Однако это устаревший синтаксис, и его рекомендуется избегать. Вместо этого используйте grep -E. Точно так же используйте grep -F вместо fgrep и grep -r вместо rgrep.

27. grep -z

Иногда ввод в grep — это не строки, заканчивающиеся символом новой строки. Например, если вы обрабатываете список имен файлов, они могут поступать из разных источников.Флаг -z указывает grep рассматривать символ NULL как конец строки. Это позволяет рассматривать входящий поток как любой обычный текстовый файл.

28. grep -a <ШАБЛОН> [имя файла]

Флаг -a указывает grep обрабатывать предоставленный файл как обычный текст. Файл может быть двоичным, но grep будет обрабатывать его содержимое, как если бы оно было текстом.

29. grep -U <ШАБЛОН> [имя файла]

Флаг -U указывает grep обрабатывать предоставленные файлы как двоичные файлы, а не текст.По умолчанию grep угадывает тип файла, глядя на первые несколько байтов. Использование этого флага отменяет работу предположений.

30. grep -m НОМЕР

При работе с большими файлами поиск выражения может длиться бесконечно. Однако, если вы хотите проверить только первые ЧИСЛО совпадений, вы можете использовать флаг -m для этого. Это быстрее, и выход часто управляем.

Заключение

Большая часть повседневной работы системного администратора связана с просеиванием больших объемов текста.Это могут быть журналы безопасности, журналы с вашего веб-сервера или почтового сервера, активность пользователей или даже большой текст страниц руководства. Grep дает вам дополнительную гибкость при работе с этими вариантами использования.

Надеюсь, приведенные выше несколько примеров и вариантов использования помогли вам лучше понять это живое ископаемое программное обеспечение.

.

15 практических примеров команд Grep в Linux / UNIX

Вам следует разобраться с командой grep в Linux.

Это часть текущей серии «15 примеров», в которой будет предоставлено 15 подробных примеров для конкретной команды или функции. Ранее мы обсудили 15 практических примеров для команды find в Linux, истории командной строки Linux и команды mysqladmin.


В этой статье мы рассмотрим 15 практических примеров использования команды grep в Linux, которые будут очень полезны как новичкам, так и экспертам.


Сначала создайте следующий demo_file, который будет использоваться в приведенных ниже примерах для демонстрации команды grep.

 $ cat demo_file
ЭТА СТРОКА ЯВЛЯЕТСЯ ПЕРВОЙ СТРОКОЙ В ЭТОМ ФАЙЛЕ.
эта строка является первой строчной строкой в ​​этом файле.
В этой строке весь первый символ слова записан в верхнем регистре.

Две строки над этой строкой пусты.
И это последняя строчка. 

1.Искать заданную строку в одном файле

В основном команда grep используется для поиска определенной строки в указанном файле, как показано ниже.

 Синтаксис:
grep "literal_string" имя_файла 
 $ grep "этот" demo_file
эта строка является первой строчной строкой в ​​этом файле.
Две строки над этой строкой пусты.
И это последняя строчка. 

2. Проверка данной строки в нескольких файлах.

 Синтаксис:
grep "строка" FILE_PATTERN 


Это также базовое использование команды grep.В этом примере давайте скопируем demo_file в demo_file1. Вывод grep также будет включать имя файла перед строкой, которая соответствует определенному шаблону, как показано ниже. Когда оболочка Linux видит метасимвол, она выполняет расширение и передает все файлы в качестве входных данных для grep.

 $ cp demo_file demo_file1

$ grep "this" demo_ *
demo_file: это первая строчная строка в этом файле.
demo_file: две строки над этой строкой пусты.
demo_file: И это последняя строка.demo_file1: это первая строчная строка в этом файле.
demo_file1: две строки над этой строкой пусты.
demo_file1: И это последняя строка. 

3. Поиск без учета регистра с использованием grep -i

 Синтаксис:
grep -i "строка" ФАЙЛ 


Это также базовое использование grep. Это ищет данную строку / шаблон без учета регистра. Таким образом, все слова, такие как «the», «THE» и «The» нечувствительны к регистру, как показано ниже.

 $ grep -i "demo_file"
ЭТА СТРОКА ЯВЛЯЕТСЯ ПЕРВОЙ СТРОКОЙ В ЭТОМ ФАЙЛЕ.эта строка является первой строчной строкой в ​​этом файле.
В этой строке весь первый символ слова записан в верхнем регистре.
И это последняя строчка. 

4. Соответствие регулярному выражению в файлах

 Синтаксис:
grep "REGEX" имя файла 


Это очень мощная функция, если вы можете эффективно использовать регулярные выражения. В следующем примере он ищет все шаблоны, которые начинаются с «линий» и заканчиваются «пустым» с любыми промежуточными элементами.т.е. для поиска «строк [что-либо промежуточное] пустое» в demo_file.

 $ grep "lines. * Empty" demo_file
Две строки над этой строкой пусты. 

Из документации grep: За регулярным выражением может следовать один из нескольких операторов повторения:

  • ? Предыдущий элемент является необязательным и соответствует не более одного раза.
  • * Предыдущий элемент будет найден ноль или более раз.
  • + Предыдущий элемент будет найден один или несколько раз.
  • {n} Предыдущий элемент встречается ровно n раз.
  • {n,} Предыдущий элемент встречается n или более раз.
  • {, m} Предыдущий элемент встречается не более m раз.
  • {n, m} Предыдущий элемент встречается не менее n раз, но не более m раз.

5. Проверка полных слов, а не подстрок с помощью grep -w

Если вы хотите найти слово и избежать его совпадения с подстроками, используйте параметр -w. При обычном поиске будут отображены все строки.

Следующий пример — это обычная команда grep, в которой выполняется поиск «is».Когда вы ищете «is», без какой-либо опции будет отображаться «is», «his», «this» и все, что имеет подстроку «is».

 $ grep -i "is" demo_file
ЭТА СТРОКА ЯВЛЯЕТСЯ ПЕРВОЙ СТРОКОЙ В ЭТОМ ФАЙЛЕ.
эта строка является первой строчной строкой в ​​этом файле.
В этой строке весь первый символ слова записан в верхнем регистре.
Две строки над этой строкой пусты.
И это последняя строчка. 


В следующем примере используется команда WORD grep, в которой выполняется поиск только слова «is».Обратите внимание, что этот вывод не содержит строки «В этой строке все первые символы слова с верхним регистром», даже если «есть» присутствует в «Это», так как следующее ищет только слово «является », А не для« этого ».

 $ grep -iw "is" demo_file
ЭТА СТРОКА ЯВЛЯЕТСЯ ПЕРВОЙ СТРОКОЙ В ЭТОМ ФАЙЛЕ.
эта строка является первой строчной строкой в ​​этом файле.
Две строки над этой строкой пусты.
И это последняя строчка. 

6. Отображение строк до / после / вокруг совпадения с помощью grep -A, -B и -C

При выполнении команды grep для огромного файла может быть полезно увидеть несколько строк после совпадения.Возможно, вам будет удобно, если grep может показать вам не только совпадающие строки, но и строки после / до / вокруг совпадения.


Создайте следующий файл demo_text для этого примера.

 $ cat demo_text
4. Навигация по словам в Vim

Вы можете выполнить несколько действий по навигации по словам, например:

 * e - перейти в конец текущего слова.
 * E - перейти в конец текущего СЛОВА.
 * b - перейти к предыдущему (перед) слову.* B - перейти к предыдущему (перед) СЛОВУ.
 * w - перейти к следующему слову.
 * W - перейти к следующему СЛОВУ.

WORD - WORD состоит из последовательности непустых символов, разделенных пробелом.
слово - слово состоит из последовательности букв, цифр и знаков подчеркивания.

Пример, показывающий разницу между WORD и word

 * 192.168.1.1 - одиночное СЛОВО
 * 192.168.1.1 - семь слов. 
6.1 Отображение N строк после совпадения

-A — это опция, которая печатает указанные N строк после совпадения, как показано ниже.

 Синтаксис:
grep -A  "строка" ИМЯ ФАЙЛА 


В следующем примере печатается совпадающая строка вместе с тремя строками после нее.

 $ grep -A 3 -i "пример" demo_text
Пример, показывающий разницу между WORD и word

* 192.168.1.1 - одиночное СЛОВО
* 192.168.1.1 - семь слов. 
6.2 Отобразить N строк до совпадения

-B — это опция, которая печатает указанные N строк перед совпадением.

 Синтаксис:
grep -B  "строка" ИМЯ ФАЙЛА
 


Когда у вас была возможность отображать N строк после совпадения, у вас есть опция -B для противоположного.

 $ grep -B 2 "single WORD" demo_text
Пример, показывающий разницу между WORD и word

* 192.168.1.1 - одиночный WORD 
6.3 Отображение N строк вокруг совпадения

-C — это опция, которая печатает указанные N строк перед совпадением. В некоторых случаях вы можете захотеть, чтобы совпадение отображалось линиями с обеих сторон. Эта опция показывает N строк с обеих сторон (до и после) совпадения.

 $ grep -C 2 "Пример" demo_text
слово - слово состоит из последовательности букв, цифр и знаков подчеркивания.Пример, показывающий разницу между WORD и word

* 192.168.1.1 - одиночный WORD 

7. Выделение поиска с помощью GREP_OPTIONS

Поскольку grep печатает строки из файла по заданному вами шаблону / строке, если вы хотите, чтобы он выделял, какая часть соответствует строке, вам нужно выполнить следующий путь.

Когда вы выполните следующий экспорт, вы получите выделение совпадающих поисков. В следующем примере он выделит все это, когда вы установите переменную среды GREP_OPTIONS, как показано ниже.

 $ экспорт GREP_OPTIONS = '- цвет = авто' GREP_COLOR = '100; 8'

$ grep этот demo_file
  эта строка  является первой строчной строкой в ​​этом файле.
Две строки выше  эта строка  пуста.
И , это  последняя строка. 

8. Рекурсивный поиск во всех файлах с помощью grep -r

Если вы хотите выполнить поиск во всех файлах в текущем каталоге и его подкаталоге. Параметр -r — это тот, который вам нужно использовать. В следующем примере будет выполняться поиск строки «ramesh» во всех файлах в текущем каталоге и во всех его подкаталогах.

 $ grep -r "рамеш" * 

9. Инвертируйте совпадение с помощью grep -v

У вас были разные опции для отображения совпадающих линий, для отображения линий до совпадения и для отображения линий после совпадения, а также для выделения совпадений. Так что вам определенно понадобится опция -v для инвертирования совпадений.

Если вы хотите отобразить строки, которые не соответствуют данной строке / шаблону, используйте параметр -v, как показано ниже. В этом примере будут отображены все строки, которые не соответствуют слову «go».

 $ grep -v "перейти" demo_text
4. Навигация по словам в Vim

Вы можете выполнить несколько действий по навигации по словам, например:

WORD - WORD состоит из последовательности непустых символов, разделенных пробелом.
слово - слово состоит из последовательности букв, цифр и знаков подчеркивания.

Пример, показывающий разницу между WORD и word

* 192.168.1.1 - одиночное СЛОВО
* 192.168.1.1 - семь слов. 

10. отобразить строки, которые не соответствуют всему заданному шаблону.

 Синтаксис:
grep -v -e "шаблон" -e "шаблон" 
 $ cat test-file.txt
а
б
c
d

$ grep -v -e "a" -e "b" -e "c" test-file.txt
d 

11. Подсчет количества совпадений с помощью grep -c

Если вы хотите подсчитать, сколько строк соответствует заданному шаблону / строке, используйте параметр -c.

 Синтаксис:
grep -c "шаблон" имя_файла 
 $ grep -c "перейти" demo_text
6 


Если вы хотите узнать, сколько строк соответствует шаблону

 $ grep -c этот demo_file
3 


Если вы хотите узнать, сколько строк не соответствует шаблону

 $ grep -v -c этот demo_file
4 

12.Отобразите только имена файлов, которые соответствуют заданному шаблону, используя grep -l

Если вы хотите, чтобы grep отображал только те имена файлов, которые соответствуют заданному шаблону, используйте параметр -l (L в нижнем регистре).

Когда вы вводите несколько файлов в grep, он отображает имена файлов, которые содержат текст, соответствующий шаблону, что будет очень удобно, когда вы попытаетесь найти некоторые заметки во всей структуре каталогов.

 $ grep -l это demo_ *
demo_file
demo_file1 

13.Показать только совпавшую строку

По умолчанию grep покажет строку, которая соответствует данному шаблону / строке, но если вы хотите, чтобы grep отображала только соответствующую строку шаблона, используйте параметр -o.

Это может быть не так уж и полезно, если вы укажете строку прямо. Но это становится очень полезным, когда вы даете шаблон регулярного выражения и пытаетесь увидеть, что он соответствует

 $ grep -o "is. * Line" demo_file
is line - это первая строчная строка
линия
это последняя строка 

14.Показать позицию совпадения в строке

Если вы хотите, чтобы grep показывал позицию, в которой он соответствует шаблону в файле, используйте следующие параметры как

 Синтаксис:
grep -o -b "шаблон" файл 
 $ cat temp-file.txt
12345
12345

$ grep -o -b "3" временный файл.txt
2: 3
8: 3 


Примечание: Результатом приведенной выше команды grep является не позиция в строке, а смещение в байтах для всего файла.

15.Показывать номер строки при отображении вывода с помощью grep -n

Для отображения номера строки файла с совпавшей строкой. Он делает нумерацию строк на основе 1 для каждого файла. Используйте параметр -n, чтобы использовать эту функцию.

 $ grep -n "перейти" demo_text
5: * e - перейти в конец текущего слова.
6: * E - перейти в конец текущего СЛОВА.
7: * b - перейти к предыдущему (перед) слову.
8: * B - перейти к предыдущему (перед) СЛОВУ.
9: * w - перейти к следующему слову.
10: * W - перейти к следующему СЛОВУ.

Дополнительные уроки Grep

Замечательные статьи о Linux

Ниже приведены несколько замечательных 15 примеров статей, которые могут оказаться полезными.

Если вам понравилась эта статья, возможно, вам также понравится ..

.

Проект документации Linux

Информация о LDP

FAQ

Манифест / лицензия

История

Волонтеры / сотрудники

Должностные инструкции

Списки рассылки

IRC

Обратная связь

Автор / внести вклад

Руководство для авторов LDP

Внесите свой вклад / помогите

Ресурсы

Как отправить

Репозиторий GIT

Загрузок

Контакты

Спонсор сайта LDP
Мастерская

LDP Wiki : LDP Wiki — это отправная точка для любой незавершенной работы
Члены |
Авторы |
Посетители
Документы


HOWTO
:
тематическая справка
последние обновления |
основной индекс |
просматривать по категориям


Руководства
:
более длинные и подробные книги
последние обновления / основной индекс


Часто задаваемые вопросы
:
Часто задаваемые вопросы
последние обновления / основной индекс


страницы руководства
:
справка по отдельным командам (20060810)

Бюллетень Linux
:
Интернет-журнал
Поиск / Ресурсы

Ссылки

Поиск OMF

Объявления / Разное

Обновления документов
Ссылка на HOWTO, которые были недавно обновлены.

.

Команда Grep в Unix с простыми примерами

Изучите команду Grep в Unix с практическими примерами:

Команда Grep в Unix / Linux — это краткая форма «глобального поиска регулярного выражения».

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

Команда Grep в Unix с примерами

Синтаксис:

 grep [параметры] [шаблон] [файл] 

Шаблон указан как регулярное выражение.. $ »Будет соответствовать всем строкам с любым одиночным символом.

# 3) Экранированные символы: Любой из специальных символов может быть сопоставлен с обычным символом, экранируя их с помощью символа «\».

Пример: «\ $ \ *» будет соответствовать строкам, содержащим строку «$ *»

# 4) Диапазон символов: Набор символов, заключенный в пару ‘[‘ и ‘]’ указывает диапазон символов для сопоставления.

Пример: «[aeiou]» будет соответствовать всем строкам, содержащим гласную.xyz] »будет соответствовать всем строкам, которые не содержат x, y или z.

# 5) Модификатор повторения: Знак «*» после символа или группы символов используется, чтобы позволить сопоставить ноль или более экземпляров предыдущего шаблона.

Команда grep поддерживает ряд параметров для дополнительных элементов управления сопоставлением:

  • -i: выполняет поиск без учета регистра.
  • -n: отображает строки, содержащие шаблон, вместе с номерами строк.
  • -v: отображает строки, не содержащие указанный шаблон.aeiou] ”file1
    • Сопоставить все строки, начинающиеся с цифры, следующей за нулем или несколькими пробелами. Например: «1». или «2.»
     $ grep «* [0-9]» file1 
    • Сопоставить все строки, содержащие слово hello в верхнем или нижнем регистре
     $ grep -i «hello» 

    Заключение

    I ‘ Я уверен, что это руководство помогло бы вам получить хорошее представление о том, что такое команда grep в Unix и как она используется в различных условиях.

    .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *