Утилита 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 ~]# egrep '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]#