Поиск информации в ОС Linux (find,grep,locate,wc, cut ...)
Last updated
Last updated
В системе Linux предусмотрено множество возможностей поиска файлов. Выбор команды, лучше всего подходящей для конкретного случая, зависит от того, о файле какого типа идет речь (текстовый файл, программа и т. д.) и какая информация о файле известна (фрагменты названия, фрагменты содержимого и т. д.).
Команда which ищет указанную команду. Она возвращает полное имя команды, которая была бы выполнена, если бы вы набрали ее имя без указания пути. Команда which осуществляет поиск только по каталогам, указанным в PATH, работая при этом исключительно быстро. PATH содержит список каталогов, в которых находятся программы. Однако необходимо учитывать, что PATH для администратора содержит больше каталогов, чем для обычного пользователя. Итак, если вы ищете системные команды, необходимо войти в систему с правами администратора.
Команда whereis просматривает все пути, обычно используемые для двоичных файлов, файлов конфигурации, man-страниц и исходного кода. Для этого ее нужно ввести после имени файла. Команда whereis охватывает больше файлов, чем which, при этом поиск не ограничивается одними только программами. Она не может искать в каталогах, которые специально не указаны программе как места для поиска (см. раздел справки man whereis).
Команда whatis выводит краткое однострочное описание из руководства (man).
Команда locate ищет файлы, в полном названии которых (путь + имя файла) содержится указанная схема поиска. Поиск осуществляется очень быстро: locate не ищет по файловой системе, а обращается к базе данных, в которой содержится список имен всех файлов из файловой системы. В зависимости от дистрибутива locate показывает все файлы, к которым пользователь может получить доступ. Если вы ищете системные файлы, войдите в систему как администратор и выполните команду locate. Использовать ее можно только в том случае, когда в системе установлен соответствующий пакет, который по умолчанию имеется не во всех дистрибутивах.
Примеры. Следующая команда ищет конфигурационный X-файл xorg.conf:
Поиск dvips (возможен, если установлен и этот пакет, и LATEX) выдает много результатов, так как результат поискового запроса имеется во многих названиях каталогов. Все эти результаты не отображаются, а подсчитываются с помощью параметра wc.
Количество результатов значительно уменьшится, если искать только те файлы, названия которых оканчиваются на 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 позволяет выполнять подсчёт считывая стандартный ввод или составной список и генерируя одну или несколько из следующих статистических данных: количество строк, количество слов и количество байтов.
-c, --bytes Вывести количество байт;
-m, --chars Вывести количество символов;
-l, --lines Вывести количество новых строк;
-w, --words Вывести количество слов.
Здесь:
Первая колонка - Количество строк (-l
)
Вторая колонка - Количество слов (-w
)
Третья колонка - Количество символов (-m
)
Команда sort
используется в Linux для сортировки содержимого текстовых файлов. Это позволяет выводить текстовые строки в определённом порядке.
Печатает сортированное слияние всех ФАЙЛ(ов) на стандартный вывод.
Если ФАЙЛ не задан или задан как -
, читает стандартный ввод.
-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]; он переопределяет соответствующие глобальные параметры сортировки для данного ключевого поля.
Сортировка по умолчанию (без опций):
Обратная сортировка:
Команда cut
предназначена для вырезания части текста из файла и записи результата в стандартный вывод.
-b, --bytes=СПИСОК
Выбрать только заданные байты
-c, --characters=СПИСОК
Выбрать только заданные символы
-d, --delimiter=РАЗДЕЛИТЕЛЬ
Использовать для разделения полей РАЗДЕЛИТЕЛЬ вместо табуляции
-f, --fields=СПИСОК
Выбрать только заданные поля; также печатать все строки, не содержащие разделителей, если только не задан параметр -s
--complement
Дополнить множество выбранных байтов, символов или полей
-s, --only-delimited
Не выводить строки, не содержащие разделителей
--output-delimiter=СТРОКА
Использовать СТРОКУ для разделения полей при выводе, по умолчанию используется разделитель для ввода
-z, --zero-terminated
Разделитель строк NUL, а не символ новой строки
Команда find очень мощная, но не менее сложная, чем описанные выше команды для поиска файлов. Она учитывает различные поисковые критерии (схемы поиска по именам файлов, размеру файлов, датам создания файла или последнего обращения к нему и т. д.). Полная справка по параметрам этой команды содержится в man find. Однако лучше всего будет продемонстрировать использование find на примерах, приведенных ниже. Учитывайте, что find работает сравнительно медленно, так как она просматривает всю файловую систему каталог за каталогом.
Если не указывать дополнительные параметры, find выдает список всех файлов, находящихся в текущем каталоге и всех его подкаталогах:
Следующая команда ищет все файлы в текущем каталоге и во всех подкаталогах, названия которых начинаются с .e:
Команда find производит поиск, начиная с каталога /usr/share/texmf, и ищет все файлы вида *.tex в каталоге, название которого оканчивается на latex.
В следующем примере find ищет все каталоги, находящиеся в /etc/. Обычные файлы, располагающиеся в /etc/., среди результатов не показываются. Список результатов упорядочивается по алфавиту с помощью команды sort (по умолчанию такой сортировки не происходит).
В следующем примере find ищет все файлы в (под)каталогах /home, принадлежащих пользователям группы users, причем искомые файлы должны были каким-либо образом быть изменены в течение последних пяти дней (содержание, права доступа и т. д.):
Команда find -mtime +5 находит такие файлы, которые были изменены ранее, чем пять дней назад, а команда -mtime 5 возвращает файлы, которые были изменены ровно пять дней назад. При этом во многих случаях «вчера» означает для find «24 и более часов от данного момента». Если вместо -mtime применить параметр -ctime, то точкой изменения времени будет считаться «время изменения индексного дескриптора» (inode change time). Эта точка изменяется и тогда, когда изменились лишь права доступа, а содержимое каталога осталось прежним.
Следующая команда удаляет все резервные копии, содержащиеся в данном каталоге и во всех подкаталогах. При этом find строит список всех сомнительных файлов и передает его команде rm через подстановку команды ($(команда)).
Если речь идет об очень большом количестве файлов, то при выполнении вышеуказанной команды возникает ошибка: запись со всеми *~-файлами может получиться настолько длинной, что превысит размер командной строки. В таких случаях следует воспользоваться либо параметром -exec- команды find, либо командой xargs.
Эта команда ищет в текстовом файле соответствия для заданной поисковой схемы. В зависимости от того, какие параметры настроены в конкретном случае, команда может дополнительно показывать найденные фрагменты текста или просто сообщать, в каком количестве строк была найдена заданная поисковая схема. Поисковая схема является так называемым регулярным выражением.
Следующая команда просматривает все TEX-файлы текущего каталога в поисках последовательности символов emacs. Список всех найденных строк (перед каждой из которых указывается имя файла) отображается на экране.
Команда grep определяет, как часто применяется функция arctan в указанных С-файлах.
Команда grep с параметром -v возвращает в качестве результата все строки, в которых отсутствует заданный шаблон поиска.
В приведенном далее примере grep удаляет из configfile все строки, которые начинаются с символа # (то есть все комментарии). Следующая команда cat дополнительно удаляет все пустые строки. Конечный результат сохраняется в файле nocomments.
Эта команда очень удобна, когда всего несколько строк конфигурационного кода приходится на сотни или тысячи строк комментариев.
Команды find и grep можно комбинировать, чтобы выполнять расширенный поиск. В следующем примере команда find просматривает все файлы на предмет того, нет ли в них последовательности символов emacs. Если такая последовательность обнаруживается, то название файла выводится на экран. Обратите внимание на то, что нельзя указывать параметр –print перед –exec (в отличие от предыдущего примера, команда grep emacs *.tex учитывает все файлы с расширением TEX независимо от глубины вложения подкаталога, в котором они могут находиться).
Следующая команда просматривает в текущем каталоге все файлы размером менее 10 Кбайт на предмет наличия в них регулярного выражения case.*in. Список найденных файлов сохраняется в файле result. Ограничение размера файла вводится для того, чтобы исключить из поиска двоичные файлы (обычно они гораздо больше 10 Кбайт).