Grep поиск или поиск в комбинации с потоками.
Grep
это вполне возможно самая популярная из существующих команд в Unix/Linux. Многие бы с этим поспорили, но стоит начать использовать grep
, эта команда будет присутствовать почти во всех ваших скриптах для консоли Linux. grep
расшифровывается, как ‘global regular expression printer‘.
GREP — утилита командной строки, которая находит на вводе строки, отвечающие заданному регулярному выражению, и выводит их, если вывод не отменён специальным ключом.
Иными словами grep
вырезает нужные вам строки из текстовых файлов которые содержат указанный пользователем текст. Grep
может быть использован двумя путями — сам по себе или в комбинации с потоками.
Cинтаксис команды:
grep 'word' filename
grep 'word' file1 file2 file3
grep 'string1 string2' filename
cat otherfile | grep 'something'
command | grep 'something'
command option1 | grep 'data'
grep --color 'data' fileName
Использование grep
в чистом виде(поиск в файлах):
grep '12:00' /var/log/backup/log.txt
grep 'mod' /root/base.txt #Поиск в файле упоминания о "mod"
grep '12:00' /var/log/backup/log.txt #Поиск в файле упоминания о событии в "12:00"
Показанная выше команда производит поиск подстроки 12.00
в файле /root/base.txt
и отображает все строки где эта подстрока встречается. Расширение файла может быть другим(.html, .php)
Чтобы выполнить поиск пользователя boo в файле /etc/passwd запустите:
grep 'root' /etc/passwd #Поиск в файле паролей пользователя root
Вывод команды:
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
По умолчанию grep использует поиск чувствительный к PeГиСTрУ!
Для поиска без учета регистра нужно указать ключ -i :
grep -i 'user' /root/base.txt #Поиск в файле без учета регистра(Найдет и user и User и users)
Для того чтобы найти только полные вхождения слова "user" :
grep -iw 'user' /root/base.txt #Поиск в файле без учета регистра(Найдет только user и USER)
Также для удобства вывода можно подсветить № строки, где есть вхождение "linkwatch" :
grep -iwn 'linkwatch' /root/base.txt #Поиск в файле без учета регистра(Найдет linkwatch)
Вывод команды:
17:root 225 0.0 0.0 0 0 ? S 2018 0:00 [linkwatch]
Вывод строки со вхождением слова из файла в месте с контекстом (осуществляется за счет использования спец ключей -A, -В, -С )
Смотрим вывод строки вхождения и указываем ключём -А еще количество строк которое нужно вывести после него:
grep -iwn -A 'linkwatch' /root/base.txt #Найдет строку с linkwatch и покажет еще 2 стоки снизу!
Вывод команды:
17:root 225 0.0 0.0 0 0 ? S 2018 0:00 [linkwatch]
18-root 565250 0.0 0.0 103328 912 pts/1 S+ 17:22 0:00 grep watch
19-1 admin 100
Смотрим вывод строки вхождения и указываем ключём -B еще количество строк которое нужно вывести перед ней:
grep -iwn -B 2 'linkwatch' /root/base.txt #Найдет строку с linkwatch и покажет еще 2 стоки сверху!
Вывод команды:
15-root 62 0.0 0.0 0 0 ? S 2018 0:46 [watchdog/14]
16-root 66 0.0 0.0 0 0 ? S 2018 0:46 [watchdog/15]
17:root 225 0.0 0.0 0 0 ? S 2018 0:00 [linkwatch]
Смотрим вывод строки вхождения и указываем ключём -С еще количество строк которое нужно вывести перед ней и после:
grep -iwn -С 2 'linkwatch' /root/base.txt #Найдет строку с linkwatch и покажет еще 2 стоки сверху и снизу !
Вывод команды:
15-root 62 0.0 0.0 0 0 ? S 2018 0:46 [watchdog/14]
16-root 66 0.0 0.0 0 0 ? S 2018 0:46 [watchdog/15]
17:root 225 0.0 0.0 0 0 ? S 2018 0:00 [linkwatch]
18-root 565250 0.0 0.0 103328 912 pts/1 S+ 17:22 0:00 grep watch
19-1 admin 100
Поиск вхождений по всему каталогу(путь указываем ./*):
grep -iwn "linkwatch" ./* #Найдет строки с linkwatch вво всем указанном каталоге
Вывод команды:
17:root 225 0.0 0.0 0 0 ? S 2018 0:00 [linkwatch]
Рекурсивный поиск файлов со вхождениями по всему каталогу(используем ключ -r путь указываем ./*):
grep -irl "linkwatch" ./* #Найдет строки с linkwatch в указанном каталоге и его поддиректориях
Вывод команды:
./base.txt
Пoиск с помощью регулярных выражений совместимых с языком пер( на примере поиска номера телефона):
grep -P "\d{3}-\d{3}-\d{2}-\d{2}" /root/base.txt #Найдет в файле выражение формата \d{3}-\d{3}-\d{2}-\d{2} {К-во цифр}
Вывод команды:
+7 968-602-8Х-7Х
Результаты данного поиска при желании можно направить в отдельный файл и чтобы записать только ту часть которая совпала а не всю строку нужно добавить ключ -o и указать файл:
grep -wioP "\d{3}-\d{3}-\d{2}-\d{2}" /root/base.txt > tel.txt # Направим результаты поиска в файл tel.txt
Вывод команды:
Файл tel.txt c содержимым: 968-602-8Х-7Х
С помощью этого приема можно собрать все телефоны и адреса почтовые из большого количества файлов и папок и засунуть вывод в один файл!
Аналогичным способом можно указать файл tel.patterns в котором записаны регулярные выражения для поиска (файлы лучше называть согласно тому, что позволяет найти это регулярное выражение)
Используем для поиска файл с регулярными выражениями(каждое выражение с новой строки надо начинать):
grep -owiPf "root/tel.patterns" /root/base.txt > tel.txt # Направим результаты поиска в файл tel.txt
и:
Источник:
Ссылки:
Источник:https://vk.com/realmanual?z=video-117227374_456247417%2Fbbe29f2d5f671b0a07%2Fpl_post_-117227374_33395