Утилита grep
Опции поиска
Опция | Описание |
---|---|
-o | показывать только найденное совпадение по регулярке |
-v | не показывать найденные строки |
-c | подсчитать количество строк |
-i | не учитывать регистр |
-P | Perl выражения \d |
-r | Прочитать все файлы в каждой папке, рекурсия |
-l | Файл, содержащий строки для поиска |
^ | Поиск с начала строки |
.$ | Поиск до конца файла |
^$ | Поиск пустых строк |
Префиксы вывода
Параметр | Описание |
---|---|
-b | Выведите байтовое смещение совпадения во входном файле |
-H | Печатать имя файла, содержащего совпадение |
-h | Не печатать имя файла, содержащего совпадение |
-n | Печатать номер строки каждого совпадения |
-T | Печатать начальный символ Tab перед совпадениями, чтобы вывод был аккуратно выровнен |
Вывод
Параметр | Описание |
---|---|
-c | Выведите только количество строк, содержащих совпадение |
–colo[u]r | Подсвечивать совпадения |
-l | Выведите имена файлов с совпадениями |
-L | Выведите имена искомых файлов, которые не содержат совпадений |
-o | Печатать только совпадающую часть строки |
-s | Подавление ошибок (например, несуществующих или нечитаемых файлов) |
-A n | Выведите n количество строк после совпадающей строки |
-B n | Выведите n количество строк перед совпадающей строкой |
-C n | Выведите n количество строк до и после совпадающей строки |
Несколько строк
По умолчанию, чтобы OR воспринимался, как регулярка, его надо экранировать
grep 'fatal\|error\|critical' /var/log/nginx/error.log
или включить режим расширенных регулярных выражений –extended-regexp
grep -E 'fatal|error|critical' /var/log/nginx/error.log
Но так будут искаться вхождения слов. Чтобы искать только целые слова, нужно
grep -w 'fatal\|error\|critical' /var/log/nginx/error.log
Регистронезависимый поиск
grep -i 'fatal\|error\|critical' /var/log/nginx/error.log
Просмотр конфиг файла без комментариев
grep ^[^#] /etc/postfix/main.cf # без пробелов egrep -v "^$|^[[:space:]]*;" /etc/php/7.1/cli/php.ini # или так egrep -v "^$|^[[:space:]]*#" /etc/postfix/main.cf
Выражение | Описание |
---|---|
^$ | Совпадение для удаления пустых строк |
^[[:space:]]*# или ^[[:space:]]* | Совпадение строк начинающихся на # или ; или содержит пробелы или табуляцию |
| | оператор или в регулярных выражениях |
Скрипт nocomment, который можно использовать самостоятельно с параметром или через pipe.
#!/bin/sh egrep -a -v '^[[:space:]]*#' $1 | egrep -a '[[:print:]]'
Поиск российских емейлов
grep -roih "[A-z0-9._-]*@[A-z0-9._-]*\.ru" /usr/share/doc | sort -u | wc
Или
egrep "^(aaa|bbb|ccc)" - начинается на aaa, bbb или ccc
Общий синтаксис
grep [pattern] FILE
Настройка | Описание |
---|---|
grep '^[A,E].*o' f.txt | Найти строки, начинающиеся на A или E и заканчивающиеся на o |
grep -f pat.txt f.txt | Сканировать файл f.txt, используя содержимое pat.txt |
grep -i Gnu f.txt | Поиск Gnu в файле f.txt без учёта регистра |
grep -v gnu f.txt | Поиск строк не содержащих gnu |
grep -w 'a.*o' f.txt | Поиск совпадений слов, игнорируя подстроки |
grep -x 'a.*o' f.txt | Найти целые строку, удовлетворяющие только, как ^(a.*o) |
Таблица параметров
Выделение папок и файлов
Параметр | Описание |
---|---|
-a | Обработайте двоичный файл так, как если бы он был текстовым |
-D <skip|read> | Пропуск или чтение FIFO, устройства или сокета |
-d <skip|read|recurse> | Пропуск, чтение или перемещение по каталогу |
--exclude '*.sh' | Не ищите файлы с суффиксом .sh |
--exclude-from FILE | Пропустите любой файл, указанный в списке FILE |
--exclude-dir *foo | Пропустите любую директорию, заканчивающуюся на foo |
-r | Когда встречается каталог, поиск файлов в нем |
-R | Поиск по каталогам и следование симлинкам |
Variants
Параметр | Описание |
---|---|
-G | Use basic regex (this is the default) |
-E | Extended regex |
-F | Interpret the search pattern as a fixed string, not regex |
-P | Use Perl regex (PCRE) |
Regular expression
Параметр | Описание | |
---|---|---|
. | Any single character | |
? | Match preceding item zero or one time | |
* | Match preceding item zero or more times | |
+ | Match preceding item one or more times | |
{2} | Match preceding item two times | |
{3,} | Match preceding item three or more times | |
{,4} | Match preceding item at most four times | |
{1,5} | Match preceding item at least once, but no more than five times | |
[A,B] | Match A or B [:alnum:] Alphanumeric character | |
[3-9] | Match all digits 3 to 9 [:alpha:] Alphabetic character | |
Start of a line [:digit:] Digits 0 through 9 | ||
$ | End of a line [:punct:] Punctuation | |
\s | Space [:space:] Space |
Примеры
grep searches the named input FILEs (or standard input if no files are named, or if a single hyphen-minus (-) is given as file name) for lines containing a match to the given PATTERN. By default, grep prints the matching lines
Найти Find all lines matching a specific keyword on a file.
grep sysadmin /etc/passwd
Display with numbers
grep -nv nologin /etc/passwd To avoid the keyword and search for other
grep -v sysadmin /etc/passwd To count how many lines match for the keywords we are searching
grep -c sysadmin /etc/passwd To search text by ignoring the case
grep -i sysadmin /etc/passwd Search all files in /home and its subdirectories for text matching a specific pattern and print the matching lines
grep -ri sysadmin /home/ Search all files in /home and its subdirectories for text matching a specific pattern and list the files which contain it
grep -ril sysadmin /home/ To search for a particular IP mentioned among many IPs. The -F ensures that the . match literal . characters, without it they would match any character.
grep -F "192.168.1.10" /var/log/syslog To search for a line that starts with Feb
grep ^Feb /var/log/syslog To search for a line that ends with queue
grep queue$ /var/log/mail.log To count the empty lines in a file (lines containing whitespace will not be counted)
grep -c ^$ /var/log/mail.log Search for a string inside all files of a directory and its subdirectories
grep -r "root" .
Try this GNU grep command with -P(Perl-regex) option,
grep -oP '\bs.*a\b' file
Explanation:
\b # Matches the word boundary(ie, match between a word character and a non word character) s # Starting character would be a literal s. .* # Matches any character zero or more times. a # Matches a literal a. \b # Matches the word boundary(ie, match between a word character and a non word character) Share Improve this answer Follow