Как найти файл в linux
Перейти к содержимому

Как найти файл в linux

  • автор:

Как найти файл в Linux? Руководство по команде find с примерами

img

Когда нужно найти какой-нибудь файл или папку в системе Linux в голову сразу приходит команда find. Она проста в использовании и имеет множество разных опций, которые позволяют оптимизировать поиск файлов. Далее приведём несколько примеров использования этой команды.

Поиск папок

Чтобы сделать поиск по папкам команде find нужно передать параметр type d. Таким образом мы скажем команде find вести поиск только по директориям:

$ find /path/to/search -type d -name "name-of-dir"

Руководство по команде find с примерами

Поиск скрытых файлов

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

$ find /path/to/search -name ".*"

Поиск файлов по размерам

Команда find дает возможность вести поиск файлов размером больше, меньше или равным указанному значению. Чтобы найти файл размером больше 10Мб нужно ввести команду:

$ find /path/to/search -size +10M

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

$ find /path/to/search -size -10M $ find /path/to/search -size 10M

Также есть возможность искать файлы размер которых находится в указанном промежутке.

$ find /path/to/search -size +100M -size -1G

Поиск файлов по списку

Допустим нам нужно найти несколько файлов, указанные в списке, который хранится в виде файла с расширением .txt. Для этого мы можем воспользоваться комбинацией команд find и grep. Чтобы данная команда работала корректно, каждый шаблона поиска в списке должен начинаться с новой строки.

$ find /path/to/search | grep -f filelist.txt

Парметр f переданный команде grep означает файл и даёт нам возможность указать файл с шаблонами для поиска. В результате работы вышеуказанной команды система вернёт нам все файлы, название которых указаны в списке.

Найти файл, которого нет в списке

Так же в системе Linux есть возможность поиска, противоположная указанному выше. То есть мы можем искать файлы, которые не указаны в списке файлов. Для этого команде grep передадим параметр vf, что означает обратное сопоставление и вернет нам файлы, названий которых не найдёт в списке шаблонов.

$ find /path/to/search | grep -vf filelist.txt

Указываем максимальную глубину поиска

По умолчанию, команда find ищет файлы во всех директориях и поддиректориях. Допустим, если мы в качестве пути для поиска укажем корневую директорию «/», то система будет искать искомый файл по всему жесткому диску. Мы можем ограничить область поиска командой maxdepth указав ему насколько глубоко нужно искать файл.

$ find . -maxdepth 0 -name "myfile.txt"

Команды указанная выше говорит системе искать файл только в указанной директории. А следующая команда предписывает вести поиск в указанной директории и в одной поддиректори.

$ find . -maxdepth 1 -name "myfile.txt"

Поиск пустых файлов

Команда find также позволяет вести поиск по пустым файлам и директориям. Для этого команде добавляем флаг empty. Следующие две команды позволяют найти пустые файли и папки. Для поиска папок к строке поиске добавляет ключ d:

$ find /path/to/search -type f empty $ find /path/to/search -type d empty

Так же можно автоматически удалять найденные пустые файлы или папки. Следующая команда найдет и удалит все пустые файлы в указанной папке и всех подпапках:

$ find /path/to/search -type f -empty delete

Поиск самого большого файла или папки

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

$ find /path/to/search -type f -printf "%s %p " | sort -n | tail -1

Заметьте, что при поиске мы прибегнули к двум другим удобным инструментам Linux: sort и tail. Sort отсортирует файл по их размеру, а tail покажет самый последний файл в списке, который и будет самым большим файлом/папкой. Мы можем изменить команду так, чтобы она выводила пять самых больших файлов для этого нужно воспользоваться следующей командой:

$ find /path/to/search -type f -printf "%s %p " | sort -n | tail -5

Также можно вывести файлы с самым меньшим размером. Следующая команда позволит вывести пять самых маленьких по объёму файлов:

$ find /path/to/search -type f -printf "%s %p " | sort -n | head -5

Чтобы найти самую большую папку по указанному пути нужно ввести команду указанную ниже:

$ find /path/to/search -type d -printf "%s %p " | sort -n | tail -1

Поиск файлов с атрибутом setuid

Атрибут setuid файла позволяет обычному пользователю запускать файлы от имени root-а. Такие файлы тоже легко найти с помощью команды find и нескольких параметров. Команда имеет два параметра, которые позволяют искать файлы с конкретными правами: -user и perm. Чтобы найти файлы, который можно запускать от имени root-а можем прописать команду:

$ find /path/to/search -user root -perm /4000

Как найти файл в Linux

На скриншоте мы добавили еще параметр exec чтобы ограничить вывод команды find. Полная команда выглядит так:

$ find /path/to/search -user root -perm /4000 -exec ls -l <> ;

Мы можем заменить root любым другим пользователем или просто опустить этот параметр и найти все файлы с правами запуска от имени root-а:

$ find /path/to/search -perm /4000

Поиск файлов с атрибутом sgid

Команда поиск файлов с атрибутом sgid почти такая же как и для SUID с той разницей, что вместо 4000 прописываем 2000:

$ find /path/to/search -perm /2000

Так же можем найти файлы, которые имеют оба указанных атрибута:

$ find /path/to/search -perm /6000

Исключение из вывода файлов и папок, к которым нет доступа

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

Permission denied

Этот случай особо актуален при поиске в корневой директории. Согласитесь сильно засоряет вывод, но этого можно избежать если перенаправить вывод stderr в stdout и передать grep для обработки. Следующей командой мы выведем все результаты работы команды find кроме строк, содержащих слова "Permission denied"^

$ find / -name "myfile.txt" 2>%1 | grep -v "Permission denied"

Поиск файлов изменённых за последние X дней

Чтобы найти файлы, которые были изменены за указанный период времени используется параметр mtime. Ниже приведены несколько примеров для поиска файлов, изменённых за последний 30 дней, больше 30 дней и меньше чем за 30 дней:

$ find /path/to/search -type f -mtime 30 $ find /path/to/search -type f -mtime +30< $ find /path/to/search -type f -mtime -30

Чтобы вывести более детальную информацию о найденных файлах можно указать параметр exec:

$ find /path/to/search -type f -mtime -30 -exec ls -l <> ;

Сортировка результатов по времени

При необходимости отсортировать результате по времени можно воспользоваться параметром printf и утилитой sort:

$ find /path/to/search -printf "%T+ %p " | sort

По умолчанию sort упорядочивает файлы от старых к новым. Чтобы указать обратный порядок сортировки достаточно добавить ключ r к команде sort:

$ find /path/to/search -printf "%T+ %p " | sort r

Разница между locate и find

В системе Linux есть и другая команда, позволяющая вести поиск файлов locate. Но так как она не имеет таких параметров поиска, как find, она не очень гибка, но достаточно практична.

$ locate myfile.txt

Утилита locate ведёт поиск по базе, которая содержит все имена файлов, находящихся в системе. Так как команда locate не ищет указанный файл по всей системе, то она намного эффективней утилиты find. Но с другой стороны база данных этой утилиты обновляется раз в день, что не позволяет найти файлы, созданные раньше, чем 24 часов. Базу данных можно вручную обновлять командой updatedb.

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

Если же поиск ведётся в папке, где мало файлов, то лучше пользоваться командой find.

Нагрузка CPU командой find

При поиске по большим каталогам команда find может требовать больше ресурсов. Это должно по своей сути позволять более важным системным процессам иметь приоритет, но если необходимо, чтобы команда find употребляла меньше ресурсов машины, можно использовать команду ionice или nice.

Просмотреть состояние процессора можно командой:

Чтобы понизить приоритет Ввода/Вывода для команды find, можно ввести следующую команду:

$ ionice -c3 -n7 find /path/to/search -name "myfile.txt"

А чтобы понизить приоритет использования CPU, нужно ввести следующую команду:

$ nice -n 19 find /path/to/search -name "myfile.txt"

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

Команда find в Linux – мощный инструмент сисадмина

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

Команда find – это невероятно мощный инструмент, позволяющий искать файлы не только по названию, но и по:

  • Дате добавления.
  • Содержимому.
  • Регулярным выражениям.

Данная команда будет очень полезна системным администраторам для:

  • Управления дисковым пространством.
  • Бэкапа.
  • Различных операций с файлами.

Команда find в Linux производит поиск файлов и папок на основе заданных вами критериев и позволяет выполнять действия с результатами поиска.

Синтаксис команды find:

$ find directory-to-search criteria action
  • directory-to-search (каталог поиска) – это отправной каталог, с которой find начинает поиск файлов по всем подкаталогам, которые находятся внутри. Если не указать путь, тогда поиск начнется в текущем каталоге;
  • criteria (критерий) – критерий, по которым нужно искать файлы;
  • action (действие) – что делать с каждым найденным файлом, соответствующим критериям.

Поиск по имени

Следующая команда ищет файл s.txt в текущем каталоге:

$ find . -name "s.txt" ./s.txt
  • . (точка) – файл относится к нынешнему каталогу
  • -name – критерии по которым осуществляется поиск. В данном случае поиск по названию файла.

В данном случае критерий -name учитывает только символы нижнего регистра и файл S.txt не появиться в результатах поиска. Чтобы убрать чувствительность к регистру необходимо использовать –iname.

$ find . -iname "s.txt" ./s.txt ./S.txt

Для поиска всех изображений c расширением .png нужно использовать шаблон подстановки *.png:

$ find . -name "*.png" ./babutafb.png ./babutafacebook.png ./Moodle2.png ./moodle.png ./moodle/moodle1.png ./genxfacebook.png

Можно использовать название каталога для поиска. Например, чтобы с помощью команды find найти все png изображения в каталоге home:

$ find /home -name "*.png" find: `/home/babuta/.ssh': Permission denied /home/vagrant/Moodle2.png /home/vagrant/moodle.png /home/tisha/hello.png find: `/home/tisha/testfiles': Permission denied find: `/home/tisha/data': Permission denied /home/tisha/water.png find: `/home/tisha/.cache': Permission denied

Если выдает слишком много ошибок в отказе разрешения, тогда можно добавить в конец команды – 2> /dev/null. Таким образом сообщения об ошибках будут перенаправляться по пути dev/null, что обеспечит более чистую выдачу.

find /home -name "*.jpg" 2>/dev/null /home/vagrant/Moodle2.jpg /home/vagrant/moodle.jpg /home/tisha/hello.jpg /home/tisha/water.jpg

Поиск по типу файла

Критерий -type позволяет искать файлы по типу, которые бывают следующих видов:

  • f – простые файлы;
  • d – каталоги;
  • l – символические ссылки;
  • b – блочные устройства (dev);
  • c – символьные устройства (dev);
  • p – именованные каналы;
  • s – сокеты;

Например, указав критерий -type d будут перечислены только каталоги:

$ find . -type d . ./.ssh ./.cache ./moodle

Поиск по размеру файла

Допустим, что вам необходимо найти все большие файлы. Для таких ситуаций подойдет критерий -size.

  • "+" — Поиск файлов больше заданного размера
  • "-" — Поиск файлов меньше заданного размера
  • Отсутствие знака означает, что размер файлов в поиске должен полностью совпадать.

В данном случае поиск выведет все файлы более 1 Гб (+1G).

$ find . -size +1G ./Microsoft_Office_16.29.19090802_Installer.pkg ./android-studio-ide-183.5692245-mac.dmg
Единицы измерения файлов:

Поиск пустых файлов и каталогов

Критерий -empty позволяет найти пустые файлы и каталоги.

$ find . -empty ./.cloud-locale-test.skip ./datafiles ./b.txt . ./.cache/motd.legal-displayed

Поиск времени изменения

Критерий -cmin позволяет искать файлы и каталоги по времени изменения. Для поиска всех файлов, измененных за последний час (менее 60 мин), нужно использовать -60:

$ find . -cmin -60 . ./a.txt ./datafiles

Таким образом можно найти все файлы в текущем каталоге, которые были созданы или изменены в течение часа (менее 60 минут).

Для поиска файлов, которые наоборот были изменены в любое время кроме последнего часа необходимо использовать +60.

$ find . -cmin +60

Поиск по времени доступа

Критерий -atime позволяет искать файлы по времени последнего доступа.

$ find . -atime +180

Таким образом можно найти файлы, к которым не обращались последние полгода (180 дней).

Поиск по имени пользователя

Опция –user username дает возможность поиска всех файлов и каталогов, принадлежащих конкретному пользователю:

$ find /home -user tisha 2>/dev/null

Таким образом можно найти все файлы пользователя tisha в каталоге home, а 2>/dev/null сделает выдачу чистой без ошибок в отказе доступа.

Поиск по набору разрешений

Критерий -perm – ищет файлы по определенному набору разрешений.

$ find /home -perm 777

Поиск файлов с разрешениями 777.

Операторы

Для объединения нескольких критериев в одну команду поиска можно применять операторы:

Например, чтобы найти файлы размером более 1 Гбайта пользователя tisha необходимо ввести следующую команду:

$ find /home -user tisha -and -size +1G 2>/dev/null

Если файлы могут принадлежать не только пользователю tisha, но и пользователю pokeristo, а также быть размером более 1 Гбайта.

$ find /home \( -user pokeristo -or -user tisha \) -and -size +1G 2>/dev/null

Перед скобками нужно поставить обратный слеш "\".

Действия

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

  • -delete — Удаляет соответствующие результатам поиска файлы
  • -ls — Вывод более подробных результатов поиска с:
    • Размерами файлов.
    • Количеством inode.
    -delete

    Полезен, когда необходимо найти и удалить все пустые файлы, например:

    $ find . -empty -delete

    Перед удалением лучше лишний раз себя подстраховать. Для этого можно запустить команду с действием по умолчанию -print.

    -exec:

    Данное действие является особенным и позволяет выполнить команду по вашему усмотрению в результатах поиска.

    -exec command <> \;
    • command – это команда, которую вы желаете выполнить для результатов поиска. Например:
      • rm
      • mv
      • cp

      С помощью –exec можно написать альтернативу команде –delete и применить ее к результатам поиска:

      $ find . -empty -exec rm <> \;

      Другой пример использования действия -exec:

      $ find . -name "*.jpg" -exec cp <> /backups/fotos \;

      Таким образом можно скопировать все .jpg изображения в каталог backups/fotos

      Заключение

      Команду find можно использовать для поиска:

      • Файлов по имени.
      • Дате последнего доступа.
      • Дате последнего изменения.
      • Имени пользователя (владельца файла).
      • Имени группы.
      • Размеру.
      • Разрешению.
      • Другим критериям.

      С полученными результатами можно сразу выполнять различные действия, такие как:

      • Удаление.
      • Копирование.
      • Перемещение в другой каталог.

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

      image

      • терминал linux
      • команда find
      • системное администрирование linux
      • системное администрирование

      Как найти файл в linux

      Для поиска файлов в Unix предназначены две команды -- find и locate . Первая выполняет поиск непосредственно в момент запуска, а вторая делает поиск по списку файлов (базе данных), который обновляется обычно раз в сутки (в большинстве систем -- поздно ночью или рано утром).

      У обеих команд есть как достоинства, так и недостатки. Так, find выдает результаты по текущему, "мгновенному" состоянию диска, но, к примеру, поиск по всему диску может занимать очень много времени. Напротив, locate выполняет поиск очень быстро, но во-первых, в базе данных может быть несколько устаревшая информация, а во-вторых, база данных составляется "из-под" пользователя " nobody " и не содержит информации о тех директориях, которые для него закрыты.

      Как find , так и locate позволяют указывать шаблон имени файла, содержащий специальные символы " * ", " ? " и т.д. Такие шаблоны надо заключать в кавычки, чтобы shell не пытался их интерпретировать.

      Поиск по диску сейчас -- find

      Команда find ищет в указанных директориях и ниже файлы, отвечающие заданному критерию ("test"). Причем критерием может быть не только имя файла, но и, к примеру, время модификации, размер или тип (файл/директория/линк и т.д). Критерии могут объединяться при помощи булевских операторов, так что можно найти, например, все файлы с расширением .txt размером не более 10К, модифицированные не позднее прошлого месяца.

      Формат вызова find следующий:

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

      Директории в списке указываются через пробел. Имена критериев всегда начинаются с " - ", аналогично ключам.

      Поиск файла по имени

      Самое частое использование find -- поиск файлов по имени. Для этого служит критерий " -name ", которому указывается шаблон имени. К примеру, чтобы найти на всем диске все файлы с расширением .txt , надо воспользоваться командой

      GNU-версия find , используемая в Linux, понимает также критерий " -iname ", отличающийся тем, что маленькие и большие буквы не различаются. Так, команда

      найдет все файлы с расширениями .exe , .EXE , .Exe и т.д.

      Поиск с несколькими критериями

      Если указать несколько критериев, то find найдет только файлы, соответствующие всем критериям сразу.

      К примеру, критерий " -type " позволяет указать тип файла -- обычный (" f "), директория (" d ") и т.д. Таким образом, чтобы найти в директории /etc все директории, имена которых начинаются на " cron ", надо сделать слежующее:

      bobby:~% find /etc -name 'cron*' -type d find: /etc/X11/xdm/authdir: Permission denied /etc/cron.daily /etc/cron.hourly /etc/cron.monthly /etc/cron.weekly bobby:~% _

      В то время как поиск просто по имени дал бы несколько лишних файлов:

      bobby:~% find /etc -name 'cron*' find: /etc/X11/xdm/authdir: Permission denied /etc/rc.d/init.d/crond /etc/logrotate.d/cron /etc/cron.daily /etc/cron.hourly /etc/cron.monthly /etc/cron.weekly bobby:~% _

      Исполнение команды с найденными файлами

      Кроме критериев команде find можно указывать также действия ("actions"). Если никакое действие не указано, то find по умолчанию добавляет " -print ", чтобы напечатать имя файла. Т.е. команда

      реально работает как

      Наиболее часто требуется действие " -exec ", позволяющее выполнить с найденным файлом некую команду, чаще всего -- ls -l .

      Пример (выдать "длинный" листинг всех файлов из директории /etc , в имени которых содержится " pass "):

      bobby:~% find /etc -name '*pass*' -type f -exec ls -l '<>' ';' -rw-r--r-- 1 root root 1362 Apr 16 20:21 /etc/passwd -rwxr-xr-x 1 root root 97 Oct 13 1998 /etc/X11/wmconfig/u serpasswd find: /etc/X11/xdm/authdir: Permission denied -rw-r--r-- 1 root root 239 Apr 27 1998 /etc/pam.d/passwd -rw-r--r-- 1 root root 1362 Apr 16 20:10 /etc/passwd- -rw-r--r-- 1 root root 1363 Apr 16 20:20 /etc/passwd.OLD bobby:~% _

      Необходимое пояснение: " -exec " воспринимает все, что стоит после него и до слова " ; ", как команду, которую надо выполнить. Причем сочетание символов " <> " заменяется на имя файла. Поскольку и " ; ", и " <> " являются специальными символами для shell, их надо "закавычить".

      Поиск по списку файлов диска -- locate

      Команда locate ищет указанные имена в базе данных, содержащей список файлов. Формат вызова locate следующий:

      bobby:~% locate Monitors /usr/X11R6/lib/X11/doc/Monitors /usr/X11R6/share/Xconfigurator/MonitorsDB bobby:~% _

      При указании нескольких имен locate найдет файлы, соответствующие любому из имен:

      bobby:~% locate xsnow xroach /etc/X11/wmconfig/xsnow /usr/share/icons/mini/mini-xsnow.xpm /usr/X11R6/bin/xsnow /usr/X11R6/include/X11/bitmaps/xsnow /usr/X11R6/man/man1/xsnow.1x /usr/X11R6/bin/xroach /usr/X11R6/man/man1/xroach.man /var/catman/X11R6/cat1/xroach.man.gz bobby:~% _

      Если ИМЯ не содержит специальных символов шаблона, то locate находит все файлы, в любом месте полного имени которых (т.е. включая директорию) встречается указанная строка. Т.е. locate в этом случае работает просто как grep по списку файлов.

      Если же ИМЯ содержит символы " * ", " ? " или " [] ", то locate находит только строки, которые точно соответствуют шаблону.

      покажет все файлы из директории /usr/X11R6 , имя которых заканчивается на " jewel ", а именно программу xjewel , но не man-страницу по ней:

      bobby:~% locate '/usr/X11R6/*jewel' /usr/X11R6/bin/xjewel bobby:~% _

      Для того же, чтобы увидеть все файлы из /usr/X11R6 , в имени которых встречается " jewel ", надо в конце шаблона также поставить " * ":

      bobby:~% locate '/usr/X11R6/*jewel*' /usr/X11R6/bin/xjewel /usr/X11R6/man/man1/xjewel.1x bobby:~% _

      В любом случае символы " . " и " / " не являются особенными. Таким образом, шаблон " *et*pass* " найдет файл /etc/passwd .

      Предупреждение
      По умолчанию в базу данных, которую просматривает locate , попадают лишь файлы с корневой файловой системы (т.е. / ). Если же, к примеру, все home-директории пользователей расположены на отдельном разделе (который монтируется, например, в /home ), то администратор системы должен добавить этот раздел в список индексируемых.

      В Linux индексирование (т.е. создание базы данных) выполняется программой updatedb , которая автоматически запускается ежедневно при помощи Cron. В RedHat Linux это выполняется из файла /etc/cron.daily/updatedb.cron . Таким образом, чтобы заставить updatedb индексировать, к примеру, раздел, смонтированный в /home , надо просто добавить его (через пробел) в список разделов в ключе " --localpaths " (т.е. чтобы было что-то типа " --localpaths='/ /home ").

      Замечание
      Команда locate есть только в BSD-системах и в Linux, в системах клона SystemV она отсутствует.

      Команда grep в Linux

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

      В этой инструкции мы рассмотрим что такое команда grep Linux, подробно разберём синтаксис и возможные опции grep, а также приведём несколько примеров работы с этой утилитой.

      Что такое grep?

      Название команды grep расшифровывается как "search globally for lines matching the regular expression, and print them". Это одна из самых востребованных команд в терминале Linux, которая входит в состав проекта GNU. До того как появился проект GNU, существовала утилита предшественник grep, с тем же названием, которая была разработана в 1973 году Кеном Томпсоном для поиска файлов по содержимому в Unix. А потом уже была разработана свободная утилита с той же функциональностью в рамках GNU.

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

      Синтаксис grep

      Синтаксис команды выглядит следующим образом:

      $ grep [опции] шаблон [/путь/к/файлу/или/папке. ]

      $ команда | grep [опции] шаблон

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

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

      Опции

      Давайте рассмотрим самые основные опции утилиты, которые помогут более эффективно выполнять поиск текста в файлах grep:

      • -E, --extended-regexp - включить расширенный режим регулярных выражений (ERE);
      • -F, --fixed-strings - рассматривать шаблон поиска как обычную строку, а не регулярное выражение;
      • -G, --basic-regexp - интерпретировать шаблон поиска как базовое регулярное выражение (BRE);
      • -P, --perl-regexp - рассматривать шаблон поиска как регулярное выражение Perl;
      • -e, --regexp - альтернативный способ указать шаблон поиска, опцию можно использовать несколько раз, что позволяет указать несколько шаблонов для поиска файлов, содержащих один из них;
      • -f, --file - читать шаблон поиска из файла;
      • -i, --ignore-case - не учитывать регистр символов;
      • -v, --invert-match - вывести только те строки, в которых шаблон поиска не найден;
      • -w, --word-regexp - искать шаблон как слово, отделенное пробелами или другими знаками препинания;
      • -x, --line-regexp - искать шаблон как целую строку, от начала и до символа перевода строки;
      • -c - вывести количество найденных строк;
      • --color - включить цветной режим, доступные значения: never, always и auto;
      • -L, --files-without-match - выводить только имена файлов, будут выведены все файлы в которых выполняется поиск;
      • -l, --files-with-match - аналогично предыдущему, но будут выведены только файлы, в которых есть хотя бы одно вхождение;
      • -m, --max-count - остановить поиск после того как будет найдено указанное количество строк;
      • -o, --only-matching - отображать только совпавшую часть, вместо отображения всей строки;
      • -h, --no-filename - не выводить имя файла;
      • -q, --quiet - не выводить ничего;
      • -s, --no-messages - не выводить ошибки чтения файлов;
      • -A, --after-content - показать вхождение и n строк после него;
      • -B, --before-content - показать вхождение и n строк перед ним;
      • -C - показать n строк до и после вхождения;
      • -a, --text - обрабатывать двоичные файлы как текст;
      • --exclude - пропустить файлы имена которых соответствуют регулярному выражению;
      • --exclude-dir - пропустить все файлы в указанной директории;
      • -I - пропускать двоичные файлы;
      • --include - искать только в файлах, имена которых соответствуют регулярному выражению;
      • -r - рекурсивный поиск по всем подпапкам;
      • -R - рекурсивный поиск включая ссылки;

      Все самые основные опции рассмотрели, теперь давайте перейдём к примерам работы команды grep Linux.

      Примеры использования grep

      Давайте перейдём к практике. Сначала рассмотрим несколько основных примеров поиска внутри файлов Linux с помощью grep.

      1. Поиск текста в файле

      В первом примере мы будем искать информацию о пользователе root в файле со списком пользователей Linux /etc/passwd. Для этого выполните следующую команду:

      grep root /etc/passwd

      В результате вы получите что-то вроде этого:

      С помощью опции -i можно указать, что регистр символов учитывать не нужно. Например, давайте найдём все строки содержащие вхождение слова time в том же файле:

      grep -i "time" /etc/passwd

      В этом случае Time, time, TIME и другие вариации слова будут считаться эквивалентными. Ещё, вы можете указать несколько условий для поиска, используя опцию -e. Например:

      grep -e "root" -e "daemon" /etc/passwd

      C помощью опции -n можно выводить номер строки, в которой найдено вхождение, например:

      grep -n 'root' /etc/passwd

      Это всё хорошо работает пока ваш поисковый запрос не содержит специальных символов. Например, если вы попытаетесь найти все строки, которые содержат символ "[" в файле /etc/grub/00_header, то получите ошибку, что это регулярное выражение не верно. Для того чтобы этого избежать, нужно явно указать, что вы хотите искать строку с помощью опции -F:

      grep -F "[" /etc/grub.d/00_header

      Теперь вы знаете как выполняется поиск текста файлах grep.

      2. Фильтрация вывода команды

      Для того чтобы отфильтровать вывод другой команды с помощью grep достаточно перенаправить его используя оператор |. А файл для самого grep указывать не надо. Например, для того чтобы найти все процессы gnome можно использовать такую команду:

      ps aux | grep "gnome"

      В остальном всё работает аналогично.

      3. Базовые регулярные выражения

      Утилита grep поддерживает несколько видов регулярных выражений. Это базовые регулярные выражения (BRE), которые используются по умолчанию и расширенные (ERE). Базовые регулярные выражение поддерживает набор символов, позволяющих описать каждый определённый символ в строке. Это: ., *, [], [^], ^ и $. Например, вы можете найти строки, которые начитаются на букву r:

      grep "^r" /etc/passwd

      Или же строки, которые содержат большие буквы:

      grep "[A-Z]" /etc/passwd

      А так можно найти все строки, которые заканчиваются на ready в файле /var/log/dmesg:

      grep "ready$" /var/log/dmesg

      Но используя базовый синтаксис вы не можете указать точное количество этих символов.

      4. Расширенные регулярные выражения

      В дополнение ко всем символам из базового синтаксиса, в расширенном синтаксисе поддерживаются также такие символы:

      • + - одно или больше повторений предыдущего символа;
      • ? - ноль или одно повторение предыдущего символа;
      • - повторение предыдущего символа от n до m раз;
      • | - позволяет объединять несколько паттернов.

      Для активации расширенного синтаксиса нужно использовать опцию -E. Например, вместо использования опции -e, можно объединить несколько слов для поиска вот так:

      grep -E "root|daemon" /etc/passwd

      Вообще, регулярные выражения grep - это очень обширная тема, в этой статье я лишь показал несколько примеров. Как вы увидели, поиск текста в файлах grep становиться ещё эффективнее. Но на полное объяснение этой темы нужна целая статья, поэтому пока пропустим её и пойдем дальше.

      5. Вывод контекста

      Иногда бывает очень полезно вывести не только саму строку со вхождением, но и строки до и после неё. Например, мы хотим выбрать все ошибки из лог-файла, но знаем, что в следующей строчке после ошибки может содержаться полезная информация, тогда с помощью grep отобразим несколько строк. Ошибки будем искать в /var/log/dmesg по шаблону "Error":

      grep -A4 "Error" /var/log/dmesg

      Выведет строку с вхождением и 4 строчки после неё:

      grep -B4 "Error" /var/log/dmesg

      Эта команда выведет строку со вхождением и 4 строчки до неё. А следующая выведет по две строки с верху и снизу от вхождения.

      grep -C2 "Error" /var/log/dmesg

      6. Рекурсивный поиск в grep

      До этого мы рассматривали поиск в определённом файле или выводе команд. Но grep также может выполнить поиск текста в нескольких файлах, размещённых в одном каталоге или подкаталогах. Для этого нужно использовать опцию -r. Например, давайте найдём все файлы, которые содержат строку Kernel в папке /var/log:

      grep -r "Kernel" /var/log

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

      grep -rI "Kernel" /var/log

      Некоторые файлы доступны только суперпользователю и для того чтобы выполнять по ним поиск вам нужно запускать grep с помощью sudo. Или же вы можете просто скрыть сообщения об ошибках чтения и пропускать такие файлы с помощью опции -s:

      grep -rIs "Kernel" /var/log

      7. Выбор файлов для поиска

      С помощью опций --include и --exclude вы можете фильтровать файлы, которые будут принимать участие в поиске. Например, для того чтобы выполнить поиск только по файлам с расширением .log в папке /var/log используйте такую команду:

      grep -r --include="*.log" "Kernel" /var/log

      А для того чтобы исключить все файлы с расширением .journal надо использовать опцию --exclude:

      grep -r --exclude="*.journal" "Kernel" /var/log

      8. Поиск слов в grep

      Когда вы ищете строку abc, grep будет выводить также kbabc, abc123, aafrabc32 и тому подобные комбинации. Вы можете заставить утилиту искать по содержимому файлов в Linux строки, которые включают только искомые слова полностью с помощью опции -w. Например:

      grep -w "root" /etc/passwd

      9. Количество строк

      Утилита grep может сообщить, сколько строк с определенным текстом было найдено файле. Для этого используется опция -c (счетчик). Например:

      grep -c 'Kernel' /var/log/dmesg

      10. Инвертированный поиск

      Команда grep Linux может быть использована для поиска строк, которые не содержат указанное слово. Например, так можно вывести только те строки, которые не содержат слово nologin:

      grep -v nologin /etc/passwd

      11. Вывод имен файлов

      Вы можете указать grep выводить только имена файлов, в которых было хотя бы одно вхождение с помощью опции -l. Например, следующая команда выведет все имена файлов из каталога /var/log, при поиске по содержимому которых было обнаружено вхождение Kernel:

      grep -lr 'Kernel' /var/log/

      12. Цветной вывод

      По умолчанию grep не будет подсвечивать совпадения цветом. Но в большинстве дистрибутивов прописан алиас для grep, который это включает. Однако, когда вы используйте команду c sudo это работать не будет. Для включения подсветки вручную используйте опцию --color со значением always:

      sudo grep --color=always root /etc/passwd

      Выводы

      Вот и всё. Теперь вы знаете что представляет из себя команда grep Linux, а также как ею пользоваться для поиска файлов и фильтрации вывода команд. При правильном применении эта утилита станет мощным инструментом в ваших руках. Если у вас остались вопросы, пишите в комментариях!

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

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