Поиск по сайту:
...Узнаешь рожденных от крови! (Овидий).

Команда grep в Linux. Полное руководство

28.04.2017
Полное руководство: Команда Grep в Linux

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

Краткая форма команды grep (Global Regular Expression and Print). На базовом уровне команда grep в Linux используются для поиска или фильтрации простых текстовых данных, используя некоторую форму регулярного выражения.

 

Команда grep в Linux и ее опции

Перед изучением команды grep, посмотрим на основной синтаксис ее.

 

Основной синтаксис для команды grep

cat <file name>|grep <string or regular expression>
 
<command>|grep <string or regular expression>
 
grep <string or regular expression> [file name]

 

Варианты с командой grep

1. Простой поиск в файле

Давайте рассмотрим пример в файле “/etc/passwd” для поиска строки в файле. Чтобы найти слово “system” при помощи команды grep, используйте команду:

[root@destroyer ~]# cat /etc/passwd|grep system

 

Пример вывода:

systemd-bus-proxy:x:899:897:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:898:896:systemd Network Management:/:/sbin/nologin

 

2. Подсчет появления слов.

В приведенном выше примере мы имеем в системе поиск слов в файл

е “/etc/passwd”. Если мы хотим знать количество или число появлений слова в файле, то используйте опцию ниже:

[root@destroyer ~]# cat /etc/passwd|grep -c system
2
[root@destroyer ~]#

 

Выше указанно, что слово появилось два раза в файле “/etc/passwd”.

 

3. Игнорировать регистрозависимые слова

Команда grep чувствительна к регистру, это означает, что он будет искать только данное слово в файле. Чтобы проверить эту функцию, создайте один файл с именем «test.txt» и с содержанием, как показано ниже:

[root@destroyer tmp]# cat test.txt
AndreyEx
andreyex
ANDREYEX
Andreyex
[root@destroyer tmp]#

 

Теперь, если вы попытаетесь найти строку «andreyex», то команда не будет перечислять все слова «andreyex» с разными вариантами, как показано ниже:

[root@destroyer tmp]# grep andreyex test.txt
andreyex
[root@destroyer tmp]#

 

Этот результат подтверждает, что только один вариант будет показан, игнорируя остальную часть слова «andreyex» с разными вариантами. И если вы хотите игнорировать этот случай, вам нужно использовать параметр «-i» с grep, как показано ниже:

[root@destroyer tmp]# grep -i andreyex test.txt
AndreyEx
andreyex
ANDREYEX
Andreyex

4. Две разные строки внутри файла с командой grep

Теперь, если вы хотите найти два слова или строки с помощью команды grep, то вы должны задать расширенные. В следующей команде мы находим две строки «system» и «nobody» в файле /etc/passwd.

[root@destroyer ~]# grep  'system\|nobody' /etc/passwd
nobody:x:89:89:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:899:897:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:898:896:systemd Network Management:/:/sbin/nologin
[root@destroyer ~]#

 

5. Рекурсивный поиск

Допустим, вы хотите найти слово или строку рекурсивно в любом месте каталога, тогда используйте опцию -r. Например, если вы хотите найти слово «check_oracle» рекурсивно в каталоге /etc, то используйте следующую команду:

[root@destroyer ~]# grep -r "check_oracle" /etc/
/etc/selinux/targeted/contexts/files/file_contexts:/usr/lib/nagios/plugins/check_oracle --      system_u:object_r:nagios_services_plugin_exec_t:s0
Binary file /etc/selinux/targeted/contexts/files/file_contexts.bin matches
/etc/selinux/targeted/modules/active/file_contexts:/usr/lib/nagios/plugins/check_oracle --      system_u:object_r:nagios_services_plugin_exec_t:s0
/etc/selinux/targeted/modules/active/file_contexts.template:/usr/lib/nagios/plugins/check_oracle        --      system_u:object_r:nagios_services_plugin_exec_t:s0
[root@destroyer ~]

 

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

[root@destroyer ~]# grep -hr "check_oracle" /etc/
/usr/lib/nagios/plugins/check_oracle    --      system_u:object_r:nagios_services_plugin_exec_t:s0
Binary file /etc/selinux/targeted/contexts/files/file_contexts.bin matches
/usr/lib/nagios/plugins/check_oracle    --      system_u:object_r:nagios_services_plugin_exec_t:s0
/usr/lib/nagios/plugins/check_oracle    --      system_u:object_r:nagios_services_plugin_exec_t:s0
[root@destroyer ~]#

 

6. Вывод команды grep.

Если вы хотите найти строку или слово в любом выводе команды, то вы должны использовать оператор «|», а затем <строка> в grep. Допустим, вы хотите найти в памяти, связанные слова вывода команды dmesg, то используйте следующую команду.

	
[root@destroyer ~]# dmesg |grep memory
[    0.000000] Base memory trampoline at [ffff880000098000] 98000 size 19456
[    0.000000] init_memory_mapping: [mem 0x00000000-0x000fffff]
[    0.000000] init_memory_mapping: [mem 0x3fe00000-0x4fffffff]
[    0.000000] init_memory_mapping: [mem 0x3c000000-0x4fdfffff]
[    0.000000] init_memory_mapping: [mem 0x00100000-0x4bffffff]
[    0.000000] kexec: crashkernel=auto resulted in zero bytes of reserved memory.
[    0.000000] Early memory node ranges
[    0.000000] PM: Registered nosave memory: [mem 0x0003e000-0x0003ffff]
[    0.000000] PM: Registered nosave memory: [mem 0x000a0000-0x000dffff]
[    0.000000] PM: Registered nosave memory: [mem 0x000e0000-0x000fffff]
[    0.000000] please try 'cgroup_disable=memory' option if you don't want memory cgroups
[    0.030181] Initializing cgroup subsys memory
[    0.862358] Freeing initrd memory: 23532k freed
[    1.064599] Non-volatile memory driver v1.3
[    1.069351] crash memory driver: version 1.1
[    1.186673] Freeing unused kernel memory: 1430k freed
[    5.567780] [TTM] Zone  kernel: Available graphics memory: 480345 kiB
[root@destroyer ~]#

 

7. Инвертирование с помощью команды grep в Linux

Допустим, если вы хотите отобразить все слова в файле, который не содержит какое-либо конкретное слово, то используйте опцию «-v». Это позволяет создать один файл с содержимым, как показано ниже:

[root@destroyer tmp]# cat test.txt
Andreyex12
Andreyex454
Andreyex34343
Andreyex
LinuxRoutes
Linux
[root@destroyer tmp]#

 

Если мы не хотим печатать строки, содержащие слово Linux, то используйте следующую команду.

[root@destroyer tmp]# grep -v Linux test.txt
Andreyex12
Andreyex454
Andreyex34343
Andreyex

 

8. Точное совпадение слова

В соответствии с примером, приведенным в пункте 7, если мы ищем Andreyex, то он будет печатать все вхождение Andreyex как «Andreyex12», «Andreyex454», «Andreyex34343», а также «Andreyex», как показано ниже:

[root@destroyer tmp]# grep  Andreyex test.txt
Andreyex12
Andreyex454
Andreyex34343
Andreyex
[root@destroyer tmp]#

 

тогда, если мы хотим найти точное слово «Andreyex» вместо этого, чтобы перечислить весь вывод выше, то используйте опцию «-w», как показано ниже:

[root@destroyer tmp]# grep -w Andreyex test.txt
Andreyex
[root@destroyer tmp]#

 

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (3 оценок, среднее: 3,67 из 5)
Загрузка...
Поделиться в соц. сетях:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

**ссылки nofollow

4 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Валентин

В примере 4. Две разные строки внутри файла с командой grep пропущено экранирование символа |, должно быть grep ‘system\|nobody’ /etc/passwd

анон

экранирование в одинарных кавычках? не надо!

Александра

Статья понравилась

Читайте также

Спасибо!

Теперь редакторы в курсе.