grep
Многоцелевая поисковая утилита, использующая регулярные выражения. Изначально это была команда в древнем строчном редакторе ed
, g/re/p, что означает -- global - regular expression - print.grep
pattern [file...]Поиск участков текста в файле(ах), соответствующих шаблону pattern
, где pattern может быть как обычной строкой, так и регулярным выражением.bash$
grep '[rst]ystem.$' osinfo.txtThe GPL governs the distribution of the Linux operating system.
Если файл(ы) для поиска не задан, то команда grep
работает как фильтр для устройства stdout, например в конвейере.bash$
ps ax | grep clock765 tty1 S 0:00 xclock
901 pts/1 S 0:00 grep clock
-i
-- выполняется поиск без учета регистра символов.-w
-- поиск совпадений целого слова.-l
-- вывод только имен файлов, в которых найдены участки, совпадающие с заданным образцом/шаблоном, без вывода совпадающих строк.-r
-- (рекурсивный поиск) поиск выполняется в текущем каталоге и всех вложенных подкаталогах.The -n
option lists the matching lines, together with line numbers.bash$
grep -n Linux osinfo.txt2:This is a file containing information about Linux.
6:The GPL governs the distribution of the Linux operating system.
-v
(или --invert-match) -- выводит только строки, не содержащие совпадений.grep pattern1 *.txt | grep -v pattern2
# Выводятся строки из "*.txt", совпадающие с "pattern1",
# но ***не*** совпадающие с "pattern2".
-c
(--count) -- выводит количество совпадений без вывода самих совпадений.grep -c txt *.sgml # (количество совпадений с "txt" в "*.sgml" файлах)
# grep -cz .
# ^ точка
# означает подсчет (-c) непустых ("." -- содержащих хотя бы один символ) элементов,
# разделенных нулевыми байтами (-z)
#
printf 'a b\nc d\n\n\n\n\n\000\n\000e\000\000\nf' | grep -cz . # 4
printf 'a b\nc d\n\n\n\n\n\000\n\000e\000\000\nf' | grep -cz '$' # 5
printf 'a b\nc d\n\n\n\n\n\000\n\000e\000\000\nf' | grep -cz '^' # 5
#
printf 'a b\nc d\n\n\n\n\n\000\n\000e\000\000\nf' | grep -c '$' # 9
# По-умолчанию, в качестве разделителя, принимается символ перевода строки (\n).
# Обратите внимание: ключ -z характерен для GNU-версии "grep".
# Спасибо S.C.
Если grep
вызывается для поиска по группе файлов, то вывод будет содержать указание на имена файлов, в которых найдены совпадения.bash$
grep Linux osinfo.txt misc.txtosinfo.txt:This is a file containing information about Linux.
osinfo.txt:The GPL governs the distribution of the Linux operating system.
misc.txt:The Linux operating system is steadily gaining in popularity.
Для того, чтобы заставить grep
выводить имя файла, когда поиск производится по одному-единственному файлу, достаточно указать устройство /dev/null в качестве второго файла.bash$
grep Linux osinfo.txt /dev/nullosinfo.txt:This is a file containing information about Linux.
osinfo.txt:The GPL governs the distribution of the Linux operating system.
Если совпадение было найдено, то grep
возвращает код завершения -- 0, это может оказаться полезным при выполнении поиска в условных операторах ( в таких случаях особый интерес может представлять ключ -q, который подавляет вывод).SUCCESS=0 # если найдено совпадение
word=Linux
filename=data.file