
LINUX / lab3_m2_iems_iems_ktni_niy16
.pdfМодуль 2. Лабораторная работа №3 Поиск и сортировка данных в ОС Linux
Цель работы: на основе командного интерпретатора BASH научиться проводить поиск и сортировку данных в ОС Linux.
Теоретические сведения
При работе в командном интерпретаторе очень часто приходится упорядочивать, сортировать файлы и каталоги, а также проводить поиск требуемой информации внутри файла по шаблону. Если в текущей папке находится 10 файлов и Вам требуется выделить файл с конкретным названием – это одно дело. Ну а что делать, если в текущей папке находится 300 файлов, а Вам нужно найти файл, название которого Вы не знаете? Знаете только, что 3 строка этого файла начинается со слова “group”. И при этом, потратив время, окажется, что вам требовалось искать в другой папке. Согласитесь, задача не простая. Ручной перебор файлов займет массу времени.
Целью этой лабораторной работы является освоение навыков проведения расширенного поиска данных в файле по шаблону, а также провидение сортировки данных по заданным критериям. Основными такими критериями обычно служат сведения об объекте: размер файла или каталога, его название или расширение (для файла), дата его создания или последней модификации, количество ссылок на него в системе, атрибуты и т.д. В Linux предусмотрен ряд команд, которые помогают пользователю работать с поиском нужной информации.
Команда grep. Первой командой, которую мы рассмотрим, является команда grep. Формат команды: grep параметр(ы) шаблон имя_файла(ов) . Команда grep
применяется для поиска и отображения данных в указанном ей файле. Команда grep осуществляет поиск в содержимом одного или нескольких файлов на предмет сравнения с регулярным выражением или символьным шаблоном. Если совпадение будет найдено, то grep выведет каждую строку, содержащую совпадение, изменение самого файла при этом не происходит. Команда может также использоваться совместно с программным каналом при перенаправлении потока стандартного вывода другой команды на себя. Например, использование этой команды совместно с программным каналом и команды отображения перечня процессов ps (process status) позволяет очень эффективно производить поиск нужных процессов для управления ими, а использование grep совместно с ls помогает в поиске нужных файлов в системе. Команда grep имеет несколько ключей, назначения которых приведены в таблице.
|
Таблица 1 – Параметры команды grep |
Параметр |
Описание |
-i |
Задает режим игнорирования регистра, символы верхнего и нижнего |
|
регистра считаются идентичными. |
-l |
Перечисляет только имена файлов, которые содержат найденные |
|
строки. |
-n |
Задает простановку относительного номера к каждой строке в файле. |
-v |
Меняет условие поиска на обратные для выдачи только тех строк, |
|
которые не соответствуют шаблону. |

-c |
Задает вывод только количества строк, которые содержат шаблон. |
-w |
Задает поиск выражения как слова. |
Покажем, как пользоваться некоторыми параметрами на примере файла gauss2.plx . С помощью команды cat выведем на экран содержимое этого файла.
Содержимое файла представляет собой набор буквенных и численных символов. Для начала произведем поиск всех строк, которые начинаются на шаблон букву «X». Для этого введем в командной строке следующее:
Теперь выполним то же самое действие, используя grep совместно с программным каналом | и командой cat.

Как видно из рисунка, последняя команда состоит из двух частей. Мы просто задаем команду вывода содержимого файла gauss2.plx с помощью команды cat, но не на экран терминала, а по программного каналу данные этого вывода передаем на стандартный вход команды grep с шаблоном поиска «X», которые уже после обработки выводятся на экран. По аналогии с предыдущей командой используем опцию –с для подсчета и вывода на экран только количества строк.
Кроме того, команда grep поддерживает несколько метасимволов в регулярных выражениях для определенного шаблона. В таблице 2 содержится описание и примеры использования некоторых метасимволов.
Таблица 2 – Метасимволы в регулярных выражениях
Метасимвол |
Значение |
Пример |
Результат |
|
||
^ |
Знак начала строки |
‘^шаблон’ |
Выбор |
всех |
строк, |
|
|
|
|
которые |
начинаются |
с |
|
|
|
|
«шаблон» |
|
|
|
$ |
Знак конца строки |
‘шаблон$’ |
Выбор |
всех |
строк, |
|
|
|
|
которые заканчиваются на |
|||
|
|
|
«шаблон» |
|
|
|
. |
Любой один символ |
‘ш….н’ |
Выбор |
строк, |
которые |
|
|
|
|
содержат символ «ш» и |
|||
|
|
|
через четыре |
символа |
||
|
|
|
символ «н» |
|
|
|
[ ] |
Соответствует одной |
‘[Шш]аблон’ |
Выбор |
строк, |
которые |
|
|
позиции в шаблоне |
|
содержат |
«Шаблон» |
и |
|
|
|
|
«шаблон» |
|
|
|
[^] |
Соответствует одному |
‘[^а-р]аблон’ |
Выбор строк, которые не |
|||
|
символу не в диапазоне |
|
содержат |
символы |
в |
|
|
поиска |
|
диапазоне от «а» до «р» и |
|||
|
|
|
находящихся |
перед |
||
|
|
|
«аблон» |
|
|
|
* |
Соответствует любому |
‘[а-я]*’ |
Выбор |
алфавитных |
||
|
количеству символов |
|
символов |
|
нижнего |
|
|
|
|
регистра |
|
|
|
Команда egrep. Команда egrep осуществляет поиск в содержимом одного или нескольких файлов заданного шаблона с использованием расширенного набора метасимволов в регулярных выражениях. Формат команды:
egrep –параметры шаблон имя_файла . Данная команда имеет свой набор метасимволов, показанный в таблице 3.
Таблица 3 – Расширенный набор метасимволов команды egrep
Метасимвол |
Описание |
Пример |
Результат |
+ |
Соответствует |
‘[а-я]+аблон’ |
Выбор одного или |

|
одному или более |
|
более |
символов |
|
предшествующих |
|
нижнего |
регистра, |
|
символов |
|
которые |
находятся |
|
|
|
в диапазоне от «а» |
|
|
|
|
до «я» и за |
|
|
|
|
которыми следует |
|
|
|
|
«аблон» |
|
в|п |
Соответствует |
‘яблоко|груша’ |
Выбирается яблоко |
|
|
одному из «в» или |
|
и/или груша |
|
|
«п» |
|
|
|
( | ) |
Символы групп |
‘(1|2)+’ |
Выбор одного или |
|
|
|
‘(к|р)+орова’ |
более |
появлений. |
|
|
|
Например, «1» или |
|
|
|
|
«2» и «корова» или |
|
|
|
|
«ророва» |
Рассмотрим пару примеров работы с командой egrep. Допустим, нам потребовалось найти все строки в файле gauss2.plx, которые содержат символ «Y» и затем следующим символом имеют символы «H» или «L». Формат команды будет следующий.
Или вам потребовалось найти все строки, которые содержат «12» и «21», то следует ввести такую команду.
Команда fgrep. Другой командой, которую мы рассмотрим, явилась команда поиска fgrep. Команда fgrep осуществляет поиск в файле ключевого выражения как фиксированной строки. Ее работа отличается от работы grep и egrep, т.к. она обрабатывает все символы и любые метасимволы регулярных выражений, указанные в командной строке как обычные символы, за исключением знака вопроса
(?) и знака доллара ($). Команду grep можно использовать для поиска словосочетаний в файлах, содержащих метасимволы. Формат команды такой же, как у grep и egrep: fgrep –параметр(ы) шаблон имя_файла(ов) .
Например, для поиска всех строк в файле /etc/group, которые содержат звезду «*», можно использовать следующую команду.

Команда sort . Данная команда предназначена для сортировки текстовых строк в одном или более файлах и вывода результатов на экран. По умолчанию sort использует символы пробела и табуляции для разделения различных полей в данных файла. Формат команды: sort (-/+)параметр имя_файла(ов) . Параметры команды sort определяют тип сортировки данных. В таблице 4 приведем некоторые параметры команды sort .
|
Таблица 4 – Описание некоторых параметров команды sort |
|
Параметр |
|
Описание |
-n |
|
Производит числовую сортировку |
(+|-)n |
|
Начинает (+n) или заканчивает (-n) сортировку поля, |
|
|
следующего за полем n. |
-r |
|
Меняет порядок сортировки |
-f |
|
Игнорирует регистр символов |
-d |
|
Используется словарная сортировка. Сравниваются только |
|
|
буквы, цифры и пробелы, все остальные символы |
|
|
игнорируются. |
-o имя_файла |
|
Сохранение результатов в файл имя_файла |
-b |
|
Игнорирует начальные пробелы при определении |
|
|
начальной и конечной позиции ограниченного ключа |
|
|
сортировки. |
-t символ |
|
Использует «символ» как разделитель полей. Если |
|
|
параметр –t не указан, то по умолчанию в качестве |
|
|
разделителей полей используются символы пробела и |
|
|
табуляции. |
С помощью команды sort выполним числовую сортировку файла gauss2.plx. Для числовой сортировки требуется использовать параметр –n. По умолчанию сортировка выполняется по первому полю.

Команда cmp. Команда cmp используется для сравнения файлов на предмет выявления отличий между ними. Команда печатает результаты, если только различия найдены. Если результаты не отображены – различий нет. Команда проводит побайтовое сравнение. Если байты в файлах различаются, выводится номер байта и номер строки с первым различием. Затем работа команды завершается. Формат команды: cmp имя_файла1 имя_файла2 . Для демонстрации этой команды создадим два текстовых файла, например, с помощью cat, куда в один столбик запишем 3 символа, вторые символы из которых различные.
Результат выполнения команды: файлы различные, найдено различие в 3м байте 2й строки.

Команда diff. Команда diff находит отличие между двумя файлами. Результат выполнение этой команды – вывод всех строк, где имеются различия между двумя текстовыми файлами с рекомендациями, как отредактировать один файл, чтоб он был похож на другой. Теперь сравним файлы r1 и r2 командой diff. Команда показывает, что вторые символы не совпадают, и предлагает провести замену второго символа или первом или во втором файлах.
Имеются 2 основные опции, которые применяются вместе с командой diff.
|
Таблица 5 – Некоторые опции команды diff |
|
Параметр |
|
Описание |
-i |
|
Игнорирует регистр символов, например, |
|
|
«Р» эквивалентно «р». |
-c |
|
Создает подробный список различий. |
Команда find. Для поиска файлов в дереве каталогов применяется команда find. Основным ее преимуществом является то, что она дает возможность искать файлы по заданным критериям, каких так имя файла; дата создания или последней модификации; размер; тип; поиск файлов, к которым производился доступ в разное время; поиск файлов, которые имеют соответствующие права. Как только find находит объект, соответствующий шаблону поиска, сразу отображает его на экране. Формат команды: find путь выражение(я) действие(я) . Путь – последовательность переходов к объекту из одной папки в другую (может использоваться абсолютный и относительный пути). Под выражением понимается параметр, который должен использоваться совместно с впередистоящим тире (-). Действие – операция, которая должна быть выполнена с объектом поиска, также используется совместно с тире (-). Действие может быть опущено. В таблицах 6-7 покажем основные выражения и действия при команде find.
|
Таблица 6 – Выражения команды find. |
Выражение |
Описание |
-name имя_файла |
Поиск файлов по имени. Могут использоваться метасимволы в |
|
“”. |
-size [+|-]n |
Поиск объектов, размер которых меньше чем –n и больше чем |
|
+n или равны n. n задается в 512-байтных блоках. |
-atime [+|-]n |
Поиск файлов, к которым производился доступ более чем +n |
|
дней назад, менее чем –n дней назад или n дней. |
-mtime [+|-]n |
Поиск файлов, которые были изменены более чем +n дней |
|
назад, менее чем –n дней или ровно n дней. |
-user loginID |
Поиск файлов, которые принадлежат пользователю loginID |
-type |
Поиск по типу объекта, например: f(файл) или d(директория). |

-perm |
Поиск файлов, которые имеют соответствующие права доступа. |
|
Таблица 7 – Действия с командой find. |
Действие |
Описание |
-exec команда {} \; |
Автоматическое выполнение указанной команды на каждый |
|
найденный файл. Перед знаком обратной черты обязательно |
|
должен быть указан пробел. |
-ok команда {} \; |
Ручное выполнение указанной команды (интерактивная форма) |
|
на каждый найденный файл. Перед знаком обратной черты |
|
обязательно должен быть указан пробел. |
Дает команду выводить каждый найденный файл на экран. |
|
|
Команда по умолчанию. |
-ls |
Выводит расширенную информацию о найденном файле: inode, |
|
размер в килобайтах, права доступа, количество жестких ссылок |
|
и информацию о владельце. |
Выполним поиск файла passwd в папке /etc . Для этого нам требуется использовать опцию –name .
В процессе поиска также отобразились объекты, доступ к которым пользователь antonk не имеет, так как эти объекты команда find под правами пользователя проверить не может. Теперь, используя метасимволы, произведем поиск всех файлов в текущей директории laba2, имена которых заканчиваются на «x».
Точка после find через пробел означает, что поиск файлов требуется производить в текущей директории. Звезда является метасимволом и означает, что до буквы «x» может находиться любое число символов. Использование метасимволов требует ограничений ввода шаблона в виде апострофов ‘’. Теперь проведем поиск всех файлов в текущей директории, которые содержат в своем названии «2», о потом еще наложим требование, чтоб из найденных файлов отобразились только те файлы, которые принадлежат пользователю kras. Для этого используем выражения -name и
–user .

Теперь повторим последнюю команду, только в конце выдадим интерактивный запрос на удаление найденного файла. Для этого потребуется использовать действие: -ok rm {} \;
Введя символ «y», мы подтверждаем свое намерение удалить файл laba2.cmd . Теперь в текущей директории файлов пользователя «kras» нет. Наконец, в последнем примере проведем автоматическое удаление всех файлов в текущей директории, начинающихся на символ «g» и размер которых больше двух блоков по 512 байт.
Команду tee часто используют вместе с программным каналом. Она позволяет обрабатывать стандартный ввод и результаты обработки в стандартный вывод с отображением действия на экране, например в файл. К примеру, требуется вывести на экран все ОФС в домашней директории пользователя antonk, начинающиеся с буквы «l», и поместить их в файл «1», путем добавления к имеющемуся содержанию (опция «a» - необязательная).
Команды head и tail. Если Вам требуется работать не с полным стандартным выводом, а только с его частью, используют команды head и tail. Команда head позволяет ограничить число строк от начала информации, а tail – с конца. Отобразим первые 5 строк файла и последние 3 строки.

Пример 1 |
|
$ head -10 dante | tail -3 | lp |
|
request id is printerA-177 |
(Стандартный ввод) |
Пример 2 |
|
$ ps -ef I tail +2 I wc -l |
|
74 |
|
Команда wc. Для получения статистической информации по стандартному выводу, а также о текстовых файлах предусмотрена команда wc. Команда wc
показывает количество строк, слов и символов, содержащихся в файле. Например,
требуется определить число строк, слов и символов стандартного вывода по всем системным процессам.
Формат команды.
wc [ -lwcm ] [ имя_файла ... ]
Из информации видно, что стандартный вывод состоит из 147 строк, 1269 слов и 9807 символов. Если требуется использовать отдельно информацию по строкам или словам или символам, применяйте опции (см. man wc).
Использование команды wc с параметрами
Вы можете использовать следующие параметры с командой wc: -1 Вывод количества строк
-w Вывод количества слов -с Вывод количества байт
-т Вывод количества символов
Использование команды wc без параметров
При использовании команды we без параметров будет выведено количество строк, слов и символов, содержащихся в файле, например:
$ wc dante
33 223 1320 dante
$
Команда touch предназначена для создания пустых файлов. Если в системе уже существует файл или каталог с таким же именем, как и у создаваемого, тогда команда touch обновляет его время изменения и доступа на текущее.
Формат команды touch имя_файла ...