Команда grep в linux (найти текст в файлах) 2021

Basic vs. extended regular expressions

In basic regular expressions the metacharacters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \).

Traditional versions of egrep did not support the { metacharacter, and some egrep implementations support \{ instead, so portable scripts should avoid { in grep -E patterns and should use to match a literal {.

GNU grep -E attempts to support traditional usage by assuming that { is not special if it would be the start of an invalid interval specification. For example, the command grep -E ‘{1’ searches for the two-character string {1 instead of reporting a syntax error in the regular expression. POSIX allows this behavior as an extension, but portable scripts should avoid it.

Параметры grep

Опция -r

—recursive

Еще больше увеличит зону поисков опция -r, которая заставит команду grep рекурсивно обследовать все дерево указанной директории, то есть субдиректории, субдиректории субдиректорий, и так далее вплоть до файлов. Например:

 grep -r menu /boot
 
 /boot/grub/grub.txt:Highlight the menu entry you want to edit and press 'e', then

/boot/grub/grub.txt:Press the key to return to the GRUB menu.
/boot/grub/menu.lst:# GRUB configuration file ‘/boot/grub/menu.lst’.
/boot/grub/menu.lst:gfxmenu (hd0,3)/boot/message

Опция -i

—ignore-case

Приказывает команде игнорировать регистр символов, таким образом, поиск будет производиться как среди заглавных, так и среди строчных букв.

Опция -c

—count

Эта опция не выводит строки, а подсчитывает количество строк, в которых обнаружен ОБРАЗЕЦ. Например:

 grep -c root /etc/group
 8

То есть в восьми строках файла /etc/group встречается сочетание символов root.

—line-number

При использовании этой опции вывод команды grep будет указывать номера строк, содержащих ОБРАЗЕЦ:

Опция -v

—invert-match

Выполняет работу, обратную обычной — выводит строки, в которых ОБРАЗЕЦ не встречается:

 grep -v print /etc/printcap
 #
 #
 # for you (at least initially), such as apsfilter
 # (/usr/share/apsfilter/SETUP, used in conjunction with the
 # LPRng lpd daemon), or with the web interface provided by the
 # (if you use CUPS).

Опция -w

—word-regexp

Заставит команду grep искать только строки, содержащие все слово или фразу, составляющую ОБРАЗЕЦ. Например:

 grep -w "длинная ко" example/*

Не дает вывода, то есть не находит строк, содержащих выражение «длинная ко». А вот команда:

 grep -w "длинная коса" example/*
 
 example/alice.txt:длинная коса!

находит точное соответствие в файле alice.txt.

Опция -x

—line-regexp

Еще более строгая. Она отберет только те строки исследуемого файла или файлов, которые полностью совпадают с ОБРАЗЦОМ.

 grep -x "1234" example/*
 
 example/123.txt:1234

Внимание: Мне попадались (на собственном компьютере) версии grep (например, GNU 2.5), в которых опция -x работала неадекватно. В то же время, другие версии (GNU 2.5.1) работали прекрасно

Если что-то не ладится с этой опцией, попробуйте другую версию, или обновите свою.

Опция -l

—files-with-matches

Команда grep с этой опцией не возвращает строки, содержащие ОБРАЗЕЦ, но сообщает лишь имена файлов, в которых данный образец найден:

 grep -l 'Алиса' example/*
 
 example/alice.txt

Замечу, что сканирование каждого из заданных файлов продолжается только до первого совпадения с ОБРАЗЦОМ.

Опция -L

—files-without-match

Наоборот, сообщает имена тех файлов, где не встретился ОБРАЗЕЦ:

 grep -L 'Алиса' example/*
 
 example/123.txt
 example/ast.txt

Как мы имели случай заметить, команда grep, в поисках соответствия ОБРАЗЦУ, просматривает только содержимое файлов, но не их имена. А так часто нужно найти файл по его имени или другим параметрам, например времени модификации! Тут нам придет на помощь простейший программный канал (pipe). При помощи знака программного канала — вертикальной черты (|) мы можем направить вывод команды ls, то есть список файлов в текущей директории, на ввод команды grep, не забыв указать, что мы, собственно, ищем (ОБРАЗЕЦ). Например:

 ls | grep grep
 
 grep/
 grep-ru.txt

Находясь в директории Desktop, мы «попросили» найти на Рабочем столе все файлы, в названии которых есть выражение «grep». И нашли одну директорию grep/ и текстовой файл grep-ru.txt, который я в данный момент и пишу.

Если мы хотим искать по другим параметрам файла, а не по его имени, то следует применить команду ls -l, которая выводит файлы со всеми параметрами:

 ls -l | grep 2008-12-30
 -rw-r--r-- 1 ya users 27 2008-12-30 08:06 123.txt
 drwxr-xr-x 2 ya users 4096 2008-12-30 08:49 example/
 -rw-r--r-- 1 ya users 11931 2008-12-30 14:59 grep-ru.txt

И вот мы получили список всех файлов, модифицированных 30 декабря 2008 года.

Команда grep незаменима при просмотре логов и конфигурационных файлов. Классически примером использования команды grep стал программный канал с командой dmesg. Команда dmesg выводит те самые сообщения ядра, которые мы не успеваем прочесть во время загрузки компьютера. Допустим, мы подключили через USB порт новый принтер, и теперь хотим узнать, как ядро «окрестило» его. Дадим такую команду:

 dmesg | grep -i usb

Опция -i необходима, так как usb часто пишется заглавными буквами. Проделайте этот пример самостоятельно — у него длинный вывод, который не укладывается в рамки данной статьи.

Grep OR Operator

Use any one of the following 4 methods for grep OR. I prefer method number 3 mentioned below for grep OR operator.

1. Grep OR Using \|

If you use the grep command without any option, you need to use \| to separate multiple patterns for the or condition.

grep 'pattern1\|pattern2' filename

For example, grep either Tech or Sales from the employee.txt file. Without the back slash in front of the pipe, the following will not work.

$ grep 'Tech\|Sales' employee.txt
100  Thomas  Manager    Sales       $5,000
200  Jason   Developer  Technology  $5,500
300  Raj     Sysadmin   Technology  $7,000
500  Randy   Manager    Sales       $6,000

2. Grep OR Using -E

grep -E option is for extended regexp. If you use the grep command with -E option, you just need to use | to separate multiple patterns for the or condition.

grep -E 'pattern1|pattern2' filename

For example, grep either Tech or Sales from the employee.txt file. Just use the | to separate multiple OR patterns.

$ grep -E 'Tech|Sales' employee.txt
100  Thomas  Manager    Sales       $5,000
200  Jason   Developer  Technology  $5,500
300  Raj     Sysadmin   Technology  $7,000
500  Randy   Manager    Sales       $6,000

3. Grep OR Using egrep

egrep is exactly same as ‘grep -E’. So, use egrep (without any option) and separate multiple patterns for the or condition.

egrep 'pattern1|pattern2' filename

For example, grep either Tech or Sales from the employee.txt file. Just use the | to separate multiple OR patterns.

$ egrep 'Tech|Sales' employee.txt
100  Thomas  Manager    Sales       $5,000
200  Jason   Developer  Technology  $5,500
300  Raj     Sysadmin   Technology  $7,000
500  Randy   Manager    Sales       $6,000

4. Grep OR Using grep -e

Using grep -e option you can pass only one parameter. Use multiple -e option in a single command to use multiple patterns for the or condition.

grep -e pattern1 -e pattern2 filename

For example, grep either Tech or Sales from the employee.txt file. Use multiple -e option with grep for the multiple OR patterns.

$ grep -e Tech -e Sales employee.txt
100  Thomas  Manager    Sales       $5,000
200  Jason   Developer  Technology  $5,500
300  Raj     Sysadmin   Technology  $7,000
500  Randy   Manager    Sales       $6,000

Анкоры

Символ каретки (^) и знак доллара ($) считаются в регулярных выражениях анкорами. Это означает, что они вызывают совпадение, только если регулярное выражение найдено в начале строки (^) или в конце строки ($):

grep -h '^zip' dirlist*.txt
zip
zipcloak
zipdetails
zipgrep
zipinfo
zipnote
zipsplit
grep -h 'zip$' dirlist*.txt
gunzip
gzip
funzip
gpg-zip
mzip
p7zip
preunzip
prezip
unzip
zip
grep -h '^zip$' dirlist*.txt
zip

Здесь мы искали по спискам файлов строку «zip», расположенную в начале строки, в конце строки, а также в строке, где она была бы одновременно и в начале, и в конце (т.е. вся строка содержала бы только «zip»)

Обратите внимание, что регулярное выражение «^$» (начало и конец между которыми ничего нет) будет соответствовать пустым строкам.

Небольшое лирическое отступление: помощник по разгадыванию кроссвордов

Даже с нашими ограниченными на данный момент познаниями в регулярных выражениях мы можем делать что-то полезное.

Если вы когда-нибудь разгадывали кроссворды, то вам нужно было решать задачи вроде «что за слово из пяти букв, где третья буква «j», а последняя буква «r», которое означает…». Этот вопрос может заставить задуматься. Знаете ли вы, что в системе Linux есть словарь? А он есть. Загляните в директорию /usr/share/dict, там вы можете найти один или несколько словарей. Словари, размещённые там, это просто длинные списки слов по одному на строку, расположенные в алфавитном порядке. В моей системе файл словаря содержит 99171 слов. Для поиска возможных ответов на вышеприведённый вопрос кроссворда, мы можем сделать так:

grep -i '^..j.r$' /usr/share/dict/american-english
Major
major

Используя это регулярное выражение, мы можем найти все слова в нашем файле словаря, которое имеет длину в пять букв, имеет «j» в третьей позиции и «r» в последней позиции.

В примере использовался английский файл словаря, поскольку он присутствует в системе по умолчанию. Предварительно скачав соответствующий словарь, вы можете делать аналогичные поиски по словам на кириллице или из любых других символов.

Кванторы

Расширенные регулярные выражения поддерживают несколько способов указания количества раз, которое совпадает элемент.

? – совпадение элемента ноль или один раз

Этот квантор по сути сводится к «сделать предыдущий элемент опциональным». Допустим, мы хотим проверить телефонный номер на правильность, и мы считаем телефонный номер правильным, если он соответствует одной из этих двух форм:

(nnn) nnn-nnnn
nnn nnn-nnnn

где «n» — это число. Мы можем сконструировать регулярное выражение вроде такого:

^\(?\)? -$

В этом выражении мы поставили за символами скобок знаки вопроса, чтобы указать, что они должны встречаться ноль или один раз. Опять, поскольку круглые скобки являются обычно метасимволами (в ERE), перед ними мы поставили обратные слеши, благодаря которым они стали обрабатываться как литералы.

Давайте попробуем это:

echo "(555) 123-4567" | grep -E '^\(?\)? -$'
(555) 123-4567
echo "555 123-4567" | grep -E '^\(?\)? -$'
555 123-4567
echo "AAA 123-4567" | grep -E '^\(?\)? -$'

Здесь мы видим, что выражение соответствует обоим формам телефонного номера, но не соответствует одному, содержащему не-цифровые символы.

* — совпадение элемента ноль или более раз

Как и метасимвол ?, * используется для обозначения опционального элемента; тем не менее, в отличие от ?, элемент может встречаться любое количество раз, не только одиножды. Допустим мы хотим увидеть, является ли строка предложением; это так, если она начинается с заглавной буквы, затем содержит любое количество больших и маленьких букв, пробелов и заканчивается точкой. Для соответствия этому (очень приблизительному) определению предложения, вы должны использовать регулярное выражение вроде такого:

] ]*\.

Выражение состоит из трёх пунктов: выражение в квадратных скобках содержащее класс символов , выражение в квадратных скобках, содержащее оба класса символов и и пробел, в конце идёт точка, экранированная обратным слешем. Второй элемент заканчивается метасимволом *, благодаря которому после начальной заглавной буквы в нашем предложении за ней могут следовать любое количество заглавных и строчных букв и пробелов, и оно всё равно считается подходящим:

echo "This works." | grep -E '] ]*\.'
This works.
echo "This Works." | grep -E '] ]*\.'
This Works.
echo "this does not" | grep -E '] ]*\.'

Выражение соответствует первым двум проверкам, но не третьей, поскольку в ней отсутствует символ требуемой начальной заглавной буквы и конечная точка.

+ — совпадение элемента один или более раз

Метасимвол + работает очень похоже на *, кроме того, что он требует хотя бы один экземпляр предшествующего элемента, чтобы привести к совпадению. Это регулярное выражение будет соответствовать только строчкам, состоящих из групп из одного или более алфавитных символов, разделённых одним пробелом:

^(]+ ?)+$
echo "This that" | grep -E '^(]+ ?)+$'
This that
echo "a b c" | grep -E '^(]+ ?)+$'
a b c
echo "a b 9" | grep -E '^(]+ ?)+$'
echo "abc   d" | grep -E '^(]+ ?)+$'

Мы видим, что это выражение не соответствует строке «a b 9», поскольку она содержит неалфавитный символ; и не соответствует «abc   d», поскольку символы «c» и «d» разделены более чем одним символом пробела.

{ } — совпадение элемента указанное количество раз

Метасимволы { и } используются для выражения минимального и максимального числа требуемых соответствий. Они могут задаваться четырьмя различными способами:

Спецификатор Значение
{n} Соответствие предыдущего элемента, если он встречается ровно n раз.
{n,m} Соответствие предыдущего элемента, если он встречается по меньшей мере n раз, но не более чем m раз.
{n,} Соответствие предыдущего элемента, если он встречается n или более раз.
{,m} Соответствие предыдущего элемента, если он встречается не более чем m раз.

Возвращаясь к нашему раннему примеру с телефонными номерами, мы можем использовать этот метод указания повторений для упрощения оригинального регулярного выражения с:

^\(?\)? -$

до:

^\(?{3}\)? {3}-{4}$

Давайте испытаем его:

echo "(555) 123-4567" | grep -E '^\(?{3}\)? {3}-{4}$'
(555) 123-4567
echo "555 123-4567" | grep -E '^\(?{3}\)? {3}-{4}$'
555 123-4567
echo "5555 123-4567" | grep -E '^\(?{3}\)? {3}-{4}$'

Как мы можем видеть, наше улучшенное регулярное выражение может успешно проверять правильность телефонных номеров как со скобками, так и без скобок, и при этом отбрасывает номера, которые имеют неправильный формат.

find — синтаксис и зачем оно нужно

find — утилита поиска файлов по имени и другим свойствам, используемая в UNIX‐подобных операционных системах. С лохматых тысячелетий есть и поддерживаться почти всеми из них.

Базовый синтаксис ключей (забран с Вики):

-name — искать по имени файла, при использовании подстановочных образцов параметр заключается в кавычки

Опция `-name’ различает прописные и строчные буквы; чтобы использовать поиск без этих различий, воспользуйтесь опцией `-iname’;

-type — тип искомого: f=файл, d=каталог, l=ссылка (link), p=канал (pipe), s=сокет;

-user — владелец: имя пользователя или UID;

-group — владелец: группа пользователя или GID;

-perm — указываются права доступа;

-size — размер: указывается в 512-байтных блоках или байтах (признак байтов — символ «c» за числом);

-atime — время последнего обращения к файлу (в днях);

-amin — время последнего обращения к файлу (в минутах);

-ctime — время последнего изменения владельца или прав доступа к файлу (в днях);

-cmin — время последнего изменения владельца или прав доступа к файлу (в минутах);

-mtime — время последнего изменения файла (в днях);

-mmin — время последнего изменения файла (в минутах);

-newer другой_файл — искать файлы созданные позже, чем другой_файл;

-delete — удалять найденные файлы;

-ls — генерирует вывод как команда ls -dgils;

-print — показывает на экране найденные файлы;

-print0 — выводит путь к текущему файлу на стандартный вывод, за которым следует символ ASCII NULL (код символа 0);

-exec command {} \; — выполняет над найденным файлом указанную команду; обратите внимание на синтаксис;

-ok — перед выполнением команды указанной в -exec, выдаёт запрос;

-depth или -d — начинать поиск с самых глубоких уровней вложенности, а не с корня каталога;

-maxdepth — максимальный уровень вложенности для поиска. «-maxdepth 0» ограничивает поиск текущим каталогом;

-prune — используется, когда вы хотите исключить из поиска определённые каталоги;

-mount или -xdev — не переходить на другие файловые системы;

-regex — искать по имени файла используя регулярные выражения;

-regextype тип — указание типа используемых регулярных выражений;

-P — не разворачивать символические ссылки (поведение по умолчанию);

-L — разворачивать символические ссылки;

-empty — только пустые каталоги.

Примерно тоже самое, только больше и в не самом удобочитаемом виде, т.к надо делать запрос по каждому ключу отдельно, можно получить по

Результатам будет нечто такое из чего можно вычленять справку по отдельному ключу или команде (кликабельно):

В качестве развлечения можно использовать:

Дабы получить мануал из самой системы по базису и ключам (тоже кликабельно);

Немного о примерах использования. Точно так же, оттуда же и тп. Просто для понимания как оно работает вообще. Наиболее просто, конечно, осознать это потренировавшись в той же консоли на реальной системе.

Выражения в квадратных скобках и Классы символов

В дополнение к совпадению любого символа в заданной позиции в нашем регулярном выражении, мы также, используя выражения в квадратных скобках, можем задать совпадение единичного символа из указанного набора символов. С выражениями в квадратных скобках мы можем указать набор символов для соответствия (включая символы, которые в противном случае были бы истолкованы как метасимволы). В этом примере, используя набор из двух символов:

grep -h 'zip' dirlist*.txt
bzip2
bzip2recover
gzip

мы найдём любые строчки, содержащие строки «bzip» или «gzip».

Набор может содержать любое количество символов, а метасимволы теряют своё специальное значение, когда помещаются внутрь квадратных скобок. Тем не менее, есть два случая в которых метасимволы, используемые внутри квадратных скобок, имеют различные значения. Первый – это каретка (^), которая используется для указания отрицания; второй – это тире (-), которое используется для указания диапазона символов.

Отрицание

Если первым символом выражения в квадратных скобках является каретка (^), то остальные символы принимаются как набор символов, которые не должны присутствовать в заданной позиции символа. Сделаем это изменив наш предыдущий пример:

grep -h 'zip' dirlist*.txt
bunzip2
gunzip
funzip
gpg-zip
mzip
p7zip
preunzip
prezip
prezip-bin
unzip
unzipsfx

С активированным отрицанием, мы получили список файлов, которые содержат строку «zip», перед которой идёт любой символ, кроме «b» или «g»

Обратите внимание, что zip не был найден. Отрицаемый набор символов всё равно требует символ на заданной позиции, но символ не должен быть членом инвертированного набора.

Символ каретки вызывает отрицание только если он является первым символом внутри выражения в квадратных скобках; в противном случае, он теряет своё специальное назначение и становится обычным символом из набора.

Традиционные диапазоны символов

Если мы хотим сконструировать регулярное выражение, которое должно найти каждый файл из нашего списка, начинающийся на заглавную букву, мы можем сделать следующее:

grep -h '^' dirlist*.txt
MAKEDEV
GET
HEAD
POST
VBoxClient
X
X11
Xorg
ModemManager
NetworkManager
VBoxControl
VBoxService

Суть в том, что мы разместили все 26 заглавных букв в выражение внутри квадратных скобок. Но мысль печатать их все не вызывает энтузиазма, поэтому есть другой путь:

grep -h '^' dirlist*.txt

Используя трёхсимвольный диапазон, мы можем сократить запись из 26 букв. Таким способом можно выразить любой диапазон символов, включая сразу несколько диапазонов, такие, как это выражение, которое соответствует всем именам файлов, начинающихся с букв и цифр:

grep -h '^' dirlist*.txt

В диапазонах символов мы видим, что символ чёрточки трактуется особым образом, поэтому как мы можем включить символ тире в выражение внутри квадратных скобок? Сделав его первым символом в выражении. Рассмотрим два примера:

grep -h '' dirlist*.txt

Это будет соответствовать каждому имени файла, содержащему заглавную букву. При этом:

grep -h '' dirlist*.txt

будет соответствовать каждому имени файла, содержащему тире, или заглавную «A», или заглавную «Z».

Классы символов POSIX

Подробнее о POSIX вы можете почитать в Википедии.

В POSIX имеются свои классы символов, которые вы можете использовать в регулярных выражениях:

Класс символов Описание
Алфавитно-цифровые символы. В ASCII эквивалентно:
То же самое, что и , с дополнительным символом подчёркивания (_).
Алфавитные символы. В ASCII эквивалентно:
Включает символы пробела и табуляции.
Управляющие коды ASCII. Включает ASCII символы с 0 до 31 и 127.
Цифры от нуля до девяти.
Видимые символы. В ASCII сюда включены символы с 33 по 126.
Буквы в нижнем регистре.
Символы пунктуации. В ASCII эквивалентно: [-!»#$%&'()*+,./:;?@_`{|}~]
Печатные символы. Все символы в плюс символ пробела.
Символы белых пробелов, включающих пробел, табуляцию, возврат каретки, новую строку, вертикальную табуляцию и разрыв страницы. В ASCII эквивалентно:
Символы в верхнем регистре.
Символы, используемые для выражения шестнадцатеричных чисел. В ASCII эквивалетно:

В этих выражениях квадратные скобки и двоеточия являются частью записи класса символов (диапазонов).

Внимание: в зависимости от настроек локали, , , и другие буквенные диапазоны могут включать буквы вашего алфавита, например, русского. Т.е

может соответствовать не , а .

Почему мы используем grep?

Grep — это инструмент командной строки, который пользователи Linux используют для поиска текстовых строк. Вы можете использовать его для поиска файла по определенному слову или комбинации слов, или вы можете направить вывод других команд Linux в grep, так что grep может показать вам только тот вывод, который вам нужен.

Давайте посмотрим на некоторые действительно распространенные примеры. Скажем, вам нужно проверить содержимое каталога, чтобы увидеть, существует ли там определенный файл. Это то, для чего вы бы использовали команду «ls».

Но чтобы ускорить весь процесс проверки содержимого каталога, вы можете направить вывод команды ls в команду grep. Давайте посмотрим в нашем домашнем каталоге папку с названием Documents.

$ ls

Desktop        Drafts                   Ваше_имя        'My files'      Samples

Documents      examples.desktop         Linux            Pictures       Templates

Downloads      Favorites                Music            Public         Videos

А теперь давайте попробуем проверить каталог снова, но на этот раз, используя grep, специально для проверки папки «Документы».

$ ls | grep Documents

Documents

Как вы можете видеть на скриншоте выше, использование команды grep сэкономило нам время, быстро изолировав искомое слово от остальной части ненужного вывода, созданного командой ls.

Если папка Documents не существует, grep не вернет ничего. Поэтому, если ничего не возвращает grep, это означает, что он не может найти слово, которое вы ищете.

File and directory selection

-a, —text Process a binary file as if it were text; this is equivalent to the —binary-files=text option.
—binary-files=TYPE If the first few bytes of a file indicate that the file contains binary data, assume that the file is of type TYPE. By default, TYPE is binary, and grep normally outputs either a one-line message saying that a binary file matches, or no message if there is no match. If TYPE is without-match, grep assumes that a binary file does not match; this is equivalent to the -I option. If TYPE is text, grep processes a binary file as if it were text; this is equivalent to the -a option. Warning: grep —binary-files=text might output binary garbage, which can have nasty side effects if the output is a terminal and if the terminal driver interprets some of it as commands.
-D ACTION,—devices=ACTION If an input file is a device, FIFO or socket, use ACTION to process it. By default, ACTION is read, which means that devices are read as if they were ordinary files. If ACTION is skip, devices are silently skipped.
-d ACTION,—directories=ACTION If an input file is a directory, use ACTION to process it. By default, ACTION is read, i.e., read directories as if they were ordinary files. If ACTION is skip, silently skip directories. If ACTION is recurse, read all files under each directory, recursively, following symbolic links only if they are on the command line. This is equivalent to the -r option.
—exclude=GLOB Skip files whose base name matches GLOB (using wildcard matching). A file-name glob can use *, ?, and as wildcards, and \ to quote a wildcard or backslash character literally.
—exclude-from=FILE Skip files whose base name matches any of the file-name globs read from FILE (using wildcard matching as described under —exclude).
—exclude-dir=DIR Exclude directories matching the pattern DIR from recursive searches.
-I Process a binary file as if it did not contain matching data; this is equivalent to the —binary-files=without-match option.
—include=GLOB Search only files whose base name matches GLOB (using wildcard matching as described under —exclude).
-r, —recursive Read all files under each directory, recursively, following symbolic links only if they are on the command line. This is equivalent to the -d recurse option.
-R,—dereference-recursive Read all files under each directory, recursively. Follow all symbolic links, unlike -r.

Работа с файлами

Команда grep может обрабатывать любое количество файлов одновременно. Создадим три файла:

 123.txt:     alice.txt:              ast.txt:
 1234         Алиса очень             Символ астериска 
 5678         красивая девочка,       обозначается (*)
 89*0         у нее такая ******      звездочкой.
              длинная коса!

И дадим команду:

 grep '*' 123.txt ast.txt alice.txt
 
 123.txt:89*0
 ast.txt:обозначается (*).
 alice.txt:у нее такая ******

В выводе перечислены файлы, и указано, в каком из них какая строка содержит символ астериска. ОБРАЗЕЦ (*) пришлось взять в кавычки, чтобы командный интерпретатор понял, что имеется в виду символ, а не условный знак. Попробуйте без кавычек, увидите — ничего не получится.

Команда grep вовсе не ограничена одним выражением в качестве ОБРАЗЦА, можно задавать хоть целые фразы. Только их нужно заключать в кавычки (одинарные или двойные):

 grep 'ная ко' 123.txt ast.txt alice.txt
 alice.txt:длинная коса!

Возможности поиска при помощи команды grep могут быть значительно расширены применением групповых символов. Например, уже упоминавшийся астериск (звездочка) используется для представления любого символа или группы символов, если речь идет о тексте, и любого файла или группы файлов, если речь идет о директории.

Создадим директорию /example, в которую поместим файлы наших примеров: 123.txt, ast.txt, alice.txt и дадим команду:

 grep '*' example/*
 example/123.txt:89*0
 example/alice.txt:у нее такая ******
 example/ast.txt:обозначается (*)

То есть мы приказали просмотреть все файлы директории /example. Таким способом можно обследовать такие огромные директории как /usr, /dev, и любые другие.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector