Поиск информации в ОС Linux (find,grep,locate,wc, cut ...)

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

Команды which и whereis, whatis

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

user$ which emacs
/usr/bin/emacs

Команда whereis просматривает все пути, обычно используемые для двоичных файлов, файлов конфигурации, man-страниц и исходного кода. Для этого ее нужно ввести после имени файла. Команда whereis охватывает больше файлов, чем which, при этом поиск не ограничивается одними только программами. Она не может искать в каталогах, которые специально не указаны программе как места для поиска (см. раздел справки man whereis).

user$ whereis fstab
fstab: /etc/fstab /usr/include/fstab.h /usr/share/man/man5/fstab.5.gz

Команда whatis выводит краткое однострочное описание из руководства (man).

# whatis ls cp rm mv
ls (1) - list directory contents
cp (1) - copy files and directories
rm (1) - remove files or directories
mv (1) - move (rename) files

Команда locate

Команда locate ищет файлы, в полном названии которых (путь + имя файла) содержится указанная схема поиска. Поиск осуществляется очень быстро: locate не ищет по файловой системе, а обращается к базе данных, в которой содержится список имен всех файлов из файловой системы. В зависимости от дистрибутива locate показывает все файлы, к которым пользователь может получить доступ. Если вы ищете системные файлы, войдите в систему как администратор и выполните команду locate. Использовать ее можно только в том случае, когда в системе установлен соответствующий пакет, который по умолчанию имеется не во всех дистрибутивах.

Примеры. Следующая команда ищет конфигурационный X-файл xorg.conf:

user$ locate xorg.conf
/etc/X11/xorg.conf
/etc/X11/xorg.conf.backup
/etc/X11/xorg.conf~
/usr/share/man/man5/xorg.conf.5x.gz

Поиск dvips (возможен, если установлен и этот пакет, и LATEX) выдает много результатов, так как результат поискового запроса имеется во многих названиях каталогов. Все эти результаты не отображаются, а подсчитываются с помощью параметра wc.

user$ locate dvips | wc -l 421

Количество результатов значительно уменьшится, если искать только те файлы, названия которых оканчиваются на dvips:

user$ locate ‚*dvips'
/usr/bin/dvips
/usr/bin/odvips
/usr/bin/opdvips
/usr/bin/pdvips
/usr/local/texmf/dvips
/usr/local/texmf/fonts/map/dvips
...

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

Детали, характерные для определенных дистрибутивов. Внедрение команд locate и updatedb отличается от дистрибутива к дистрибутиву. В Debian, Fedora и Ubuntu эти команды входят в состав стандартного пакета mlocate. Файловая база данных находится в файле /var/lib/mlocate/mlocate.db и ежедневно обновляется программой Cron-Job /etc/cron.daily/mlocate. Конфигурационный файл /etc/updatedb.conf определяет, какие каталоги и файловые системы не будут учитываться при поиске (например, CD, DVD, различные буферные каталоги).

В стандартной сборке openSUSE команда locate отсутствует. Прежде чем вы сможете пользоваться этой поисковой командой, потребуется установить пакет locate и один раз выполнить updatedb, находясь в системе с правами администратора. В дальнейшем эта команда будет ежедневно выполняться программой Cron-Job /etc/cron.daily/suse.de-updatedb. Конфигурация осуществляется через /etc/sysconfig/locate.

Команда wc

Команда wc позволяет выполнять подсчёт считывая стандартный ввод или составной список и генерируя одну или несколько из следующих статистических данных: количество строк, количество слов и количество байтов.

user$ wc [ПАРАМЕТР]… [ФАЙЛ]…

Параметры

-c, --bytes Вывести количество байт;

-m, --chars Вывести количество символов;

-l, --lines Вывести количество новых строк;

-w, --words Вывести количество слов.

user$:~/webprojects/linuxcookbook.ru/articles:$ wc ustanovka-nastroyka-conky-linux 
 133  493 7516 ustanovka-nastroyka-conky-linux

Здесь:

Первая колонка - Количество строк (-l)

Вторая колонка - Количество слов (-w)

Третья колонка - Количество символов (-m)

Команда sort

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

sort [ПАРАМЕТР]… [ФАЙЛ]…

Печатает сортированное слияние всех ФАЙЛ(ов) на стандартный вывод.

Если ФАЙЛ не задан или задан как -, читает стандартный ввод.

Параметры

-b, --ignore-leading-blanks

Игнорировать начальные пропуски

-d, --dictionary-order

Рассматривать только пропуски, буквы и цифры

-f, --ignore-case

Игнорировать регистр букв

-g, --general-numeric-sort

Сравнивать в соответствии с общим числовым значением

-i, --ignore-nonprinting

Рассматривать только печатные символы

-h, --human-numeric-sort

Сравнивать числа в удобном для человека виде (например, 2K 1G)

-n, --numeric-sort

Сравнивать по числовым значениям строк

-r, --reverse

Изменить результаты сравнения на противоположные

-c, --check, --check=diagnose-first

Проверять, сортированы ли входные файлы

-k, --key=ОПР_КЛЮЧА

Сортировать по ключу; в ОПР_КЛЮЧА задано расположение и тип

-m, --merge

Объединить уже отсортированные файлы

-o, --output=ФАЙЛ

Выводить в ФАЙЛ, а не на стандартный вывод

-u, --unique

С -c, проверять порядок строго; без -c, выводить только первое среди нескольких равных

ОПР_КЛЮЧА задается как F[.C][OPTS][,F[.C][OPTS]] для начала и конца положения, где F — номер поля, а C — позиция в поле, оба отсчитываются от 1, а конечная позиция по умолчанию равна концу строки.

Если не задан параметр -t или -b, то символы в поле отсчитываются от начала предшествующего пробельного символа. OPTS составляется из одной или нескольких букв, задающих порядок сортировки [bdfgiMhnRrV]; он переопределяет соответствующие глобальные параметры сортировки для данного ключевого поля.

Сортировка по умолчанию (без опций):

oleg@mobile:~:$ sort example.txt 

Александр
Алексей
Валерий
Валерий
Василий
Дарья
Дмитрий
Иван
Иван
Ирина
Мария
Мария
Никита
Николай
Тамара

Обратная сортировка:

oleg@mobile:~:$ sort -r example.txt 
Тамара
Николай
Никита
Мария
Мария
Ирина
Иван
Иван
Дмитрий
Дарья
Василий
Валерий
Валерий
Алексей
Александр

Команда cut

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

cut [опция] [файл]

Параметры

-b, --bytes=СПИСОК

Выбрать только заданные байты

-c, --characters=СПИСОК

Выбрать только заданные символы

-d, --delimiter=РАЗДЕЛИТЕЛЬ

Использовать для разделения полей РАЗДЕЛИТЕЛЬ вместо табуляции

-f, --fields=СПИСОК

Выбрать только заданные поля; также печатать все строки, не содержащие разделителей, если только не задан параметр -s

--complement

Дополнить множество выбранных байтов, символов или полей

-s, --only-delimited

Не выводить строки, не содержащие разделителей

--output-delimiter=СТРОКА

Использовать СТРОКУ для разделения полей при выводе, по умолчанию используется разделитель для ввода

-z, --zero-terminated

Разделитель строк NUL, а не символ новой строки

Команды find и grep

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

Команда find

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

user$ find
...

Следующая команда ищет все файлы в текущем каталоге и во всех подкаталогах, названия которых начинаются с .e:

user$ find -name '.e*'
./.evolution
./.emacs
./.emacs~
./.esd_auth
...

Команда find производит поиск, начиная с каталога /usr/share/texmf, и ищет все файлы вида *.tex в каталоге, название которого оканчивается на latex.

user$ find /usr/share/texmf -path '*latex/*.tex'
/usr/share/texmf/ptex/platex/base/plnews03.tex
/usr/share/texmf/ptex/platex/base/kinsoku.tex
...

В следующем примере find ищет все каталоги, находящиеся в /etc/. Обычные файлы, располагающиеся в /etc/., среди результатов не показываются. Список результатов упорядочивается по алфавиту с помощью команды sort (по умолчанию такой сортировки не происходит).

root# find /etc -type d | sort
/etc
/etc/acpi
/etc/acpi/actions
...

В следующем примере find ищет все файлы в (под)каталогах /home, принадлежащих пользователям группы users, причем искомые файлы должны были каким-либо образом быть изменены в течение последних пяти дней (содержание, права доступа и т. д.):

root# find /home -group users -mtime -5
...

Команда find -mtime +5 находит такие файлы, которые были изменены ранее, чем пять дней назад, а команда -mtime 5 возвращает файлы, которые были изменены ровно пять дней назад. При этом во многих случаях «вчера» означает для find «24 и более часов от данного момента». Если вместо -mtime применить параметр -ctime, то точкой изменения времени будет считаться «время изменения индексного дескриптора» (inode change time). Эта точка изменяется и тогда, когда изменились лишь права доступа, а содержимое каталога осталось прежним.

Следующая команда удаляет все резервные копии, содержащиеся в данном каталоге и во всех подкаталогах. При этом find строит список всех сомнительных файлов и передает его команде rm через подстановку команды ($(команда)).

user$ rm $(find . -name '*~')

Если речь идет об очень большом количестве файлов, то при выполнении вышеуказанной команды возникает ошибка: запись со всеми *~-файлами может получиться настолько длинной, что превысит размер командной строки. В таких случаях следует воспользоваться либо параметром -exec- команды find, либо командой xargs.

Команда grep

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

Следующая команда просматривает все TEX-файлы текущего каталога в поисках последовательности символов emacs. Список всех найденных строк (перед каждой из которых указывается имя файла) отображается на экране.

user$ grep emacs *.tex
...

Команда grep определяет, как часто применяется функция arctan в указанных С-файлах.

user$ grep -c arctan\(.*\) *.c

Команда grep с параметром -v возвращает в качестве результата все строки, в которых отсутствует заданный шаблон поиска.

В приведенном далее примере grep удаляет из configfile все строки, которые начинаются с символа # (то есть все комментарии). Следующая команда cat дополнительно удаляет все пустые строки. Конечный результат сохраняется в файле nocomments.

user$ grep -v '^#' configfile | cat -s > nocomments

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

Комбинирование find и grep

Команды find и grep можно комбинировать, чтобы выполнять расширенный поиск. В следующем примере команда find просматривает все файлы на предмет того, нет ли в них последовательности символов emacs. Если такая последовательность обнаруживается, то название файла выводится на экран. Обратите внимание на то, что нельзя указывать параметр –print перед –exec (в отличие от предыдущего примера, команда grep emacs *.tex учитывает все файлы с расширением TEX независимо от глубины вложения подкаталога, в котором они могут находиться).

user$ find -name '*.tex' -type f -exec grep -q emacs {} \; -print
...

Следующая команда просматривает в текущем каталоге все файлы размером менее 10 Кбайт на предмет наличия в них регулярного выражения case.*in. Список найденных файлов сохраняется в файле result. Ограничение размера файла вводится для того, чтобы исключить из поиска двоичные файлы (обычно они гораздо больше 10 Кбайт).

user$ find -name '*' -maxdepth 1 -size -10k -exec grep -q \
> case.*in {} \; -print > result

Last updated