Практическая работа №6. Работа с файлами в UNIX
Цель работы: знакомство с командной строкой UNIX, командами по работе с файловой системой и командами обработки текстовых файлов.
Изучаемые команды: cat, cd, cp, cut, echo, find, grep, head, ln, ls, mkdir, mv, paste, pwd, sort, tail, tar, touch, uniq, wc
Знакомство с каталогами UNIX
Здесь будет освещено знакомство с командами UNIX, изучение файловой системы и базовых каталогов, создание рабочей среды в домашнем каталоге пользователя для выполнения всех последующих команд.
Начальные условия: Командная строка после входа в систему.
Получить имя текущего каталога с помощью команды pwd:
Перейти в корневой каталог с помощью команды cd /:
Отметить, как изменилось строка приглашения.
Посмотреть содержимое корневого каталога с помощью команды ls:
Сравнить с использованием «раскрашенного» вывода команды ls -F --color:
Директории отмечаются синим цветом и знаком «/» после имени.
Посмотреть содержимое домашнего каталога с помощью команды ls -F --color ~:
Возможно, домашний каталог пуст.
Вернуться в домашний каталог с помощью cd без параметров:
Создать директорию
test
с помощью команды mkdir test:Посмотреть обновлённое содержимое домашнего каталога ls -F --color:
Создать поддиректорию
subtest
в директорииtest
командой mkdir test/subtest:Посмотреть содержимое домашнего каталога и его подкаталогов с помощью ключа рекурсивного просмотра
-R
в команде ls -F --color -R:
Изучение типов файлов в UNIX
Тут рассматриваются типы файлов в UNIX: простые файлы, директории, ссылки. Изучаются команды создания и копирования файлов. Показывается разница между жесткими и символическими ссылками, между копированием и переносом файла.
Начальные условия: Командная строка. Директория test после предыдущего сценария.
Cоздать пустой файл с помощью команды touch test/first.txt:
Добавить строку текста в конец файла с помощью команды echo "Hello, world" >> test/first.txt и перенаправления вывода:
Посмотреть содержимое файла с помощью команды cat test/first.txt:
Посмотреть расширенную информацию о каталоге, используя ключ
-l
команды ls. ls -F --color -l test:Добавить псевдоним командной оболочки, чтобы сократить размер команды, с помощью команды alias ls='ls -F --color -l':
Посмотреть глубже на директорию
test
, используя ключи-a
и-i
. ls -a -i testПервый столбец – номера индексных узлов файловой системы. Третий столбец – число жёстких ссылок файла.
Перейти в каталог
test
с помощью команды cd testСкопировать файл с помощью команды cp first.txt copy1.txt:
Новый файл имеет свой собственный индексный узел.
Переименовать файл с помощью команды mv first.txt orig.txt. mv first.txt orig.txt:
Отметим, что изменилось только имя файла, все остальные атрибуты остались прежними.
Создать жёсткую ссылку командой ln orig.txt copy2.txt:
Добавилась ещё одна ссылка на тот же файл, число ссылок увеличилось на 1.
Создать символическую ссылку командой ln -s orig.txt orig.lnk:
Новый файл имеет новый индексный узел и размер, равный имени файла
orig.txt
.Сравним содержимое файлов при обращении к ним по имени:
К одним и тем же данным можно обратиться через жесткую или символическую ссылку.
Поиск системных журналов
Изучается команда поиска файлов и директорий.
Начальные условия: Командная строка, директория test после прошлого сценария.
Перейти в каталог
test
с помощью команды cd test:Вывести список всех файлов и директорий в текущей директории, включая содержимое поддиректорий с помощью команды find:
Найти все файлы и дериктории в текущей директории и ее поддиректориях, которые начиняются на «o» с помощью команды find -name "o*":
Найти все файлы и дериктории в директории
/etc
и ее поддиректориях, которые начиняются на «o» с помощью команды find /etc -name "o*":Найти все обычные файлы в директории
/etc
и ее поддиректориях, которые начинаются на «o» с помощью команды find /etc -name "o*" -a -type f:Найти все обычные файлы в директории
/var/
и ее поддиректориях, заканчивающиеся на «log»:Список найденных файлов может быть слишком большим и для его просмотра можно воспользоваться «прокруткой» терминала с помощью клавиш Shift+PgUp и Shift+PgDn
Исключить вывод сообщений об ошибках (например, «Permission denied») с помощью перенаправления вывода ошибок в специальное устройство
/dev/null
. Для этого ввести команду find /var -name "*log" -a -type f 2>/dev/nullСоздать директорию
logs
с помощью команды mkdir test/logs:Скопировать найденные файлы в локальную директорию с помощью параметра
-exec
команды find. Для этого ввести команду find /var -name "*log" -a -type f -exec cp {} test/logs/ \; 2>/dev/nullБыли скопированы все файлы, права на чтение которых у нас есть.
Архивирование и деархивирование файлов и директорий
Здесь изучается команда архивирования файлов и директорий. Командная строка, директория test после прошлого сценария.
Начальные условия:
Перейти в домашнюю директорию с помощью команды cd:
Создать архив с именем
test.tar.gz
с применением сжатия, содержащий директориюtest
с помощью команды tar -czf test.tar.gz test:Создать новую директорию для содержимого архива командой mkdir test2:
Перейти в новую директорию с помощью команды cd test2:
Развернуть содержимое архива в текущую директорию с помощью команды tar -xzf ../test.tar.gz:
Убедиться, что содержимое распакованного архива совпадает с оригинальной директорией. Ввести команду ls -l -F:
Создание новых текстовых файлов
Тут изучаются команды для создания и модифицирования текстовых файлов. Командная строка.
Начальные условия:
Ввести команду echo "One line":
Данная команда принимает строку в виде аргумента и выводит её на стандартный вывод.
Ввести ту же команду, но перенаправить вывод в файл
second.txt
с помощью «>». Ввести команду echo "One line" > second.txt:Добавить в конец файла
second.txt
строку «A line» с помощью другого перенаправления echo "A line" >> second.txt:Вывести содержимое файла с помощью команды cat second.txt:
С помощью команды cat можно создавать многострочные файлы –, если переопределить вывод программы в файл и вводить текст до нажатия Ctrl+D (конец ввода). Ввести команду cat >multiline.txt и набрать текст
Убедиться, что содержимое файла совпадает с введённым текстом, включая все переводы строки. Для этого ввести команду cat multiline.txt
Основным назначением команды cat является объединение файлов, имена которых передаются как аргументы командной строки. Объединить файлы с помощью команды cat orig.txt second.txt multiline.txt > big.txt:
Убедиться, что новый файл содержит строки из перечисленных файлов с помощью команды cat big.txt:
Разрезание и склеивание файлов
Здесь изучается, как выделять информацию, разбитую на части с помощью специального символа-разделителя (например, пробела или символа :), из файлов и создавать новые структурированные файлы.
Начальные условия: Командная строка.
Посмотреть содержимое файла
/etc/passwd
, в котором содержится информация о пользователях системы, с помощью команды cat /etc/passwd:Каждая строка хранит запись об отдельном пользователе. Запись состоит из полей, разделённых символом «:».
Выделить первый столбец в каждой записи, установив разделитель в «:», с потощью команды cat /etc/passwd | cut -f1 -d::
Отсортировать список пользователей по алфавиту с помощью команды cat /etc/passwd | cut -f1 -d: | sort:
Выделить седьмой столбец в каждой записи, соответствующий командной оболочке пользователя, с помощью команды cat /etc/passwd | cut -f7 -d:
Список содержит много повторяющихся строк.
Удалить повторяющиеся строки командой cat /etc/passwd | cut -f7 -d: | uniq:
Некоторые повторяющиеся строки остались, так как сравниваются только последовательные строки.
Добиться полной уникальности, предварительно отсортировав строки с помощью команды sort. Ввести команду cat /etc/passwd | cut -f7 -d: | sort | uniq:
Выделить первый и седьмой столбец файла
/etc/passwd
в отдельные файлы. Для этого ввести команды cat /etc/passwd | cut -f1 -d: > users и cat /etc/passwd | cut -f7 -d: > shells:Объединить результаты с помощью команды paste users shells:
Быстрый анализ текстов
Изучим команды, которые позволяют провести первичный анализ файла: с чего он начинается, как заканчивается и каков его размер.
Начальные условия: Командная строка.
Получить число строк в файле
/etc/passwd
с помощью команды wc -l /etc/passwd :Или другим способом: посчитав число слов в созданном ранее файле
users
с помощью команды cat users | wc -w:Посмотреть первые несколько строк длинного файла с помощью команды head logs/Xorg.0.log:
Аналогично, посмотреть последние несколько строк с помощью команды tail logs/Xorg.0.log:
Это бывает полезно при просмотре системных журналов – в них самые последние события содержатся в конце файлов.
Поиск строк по регулярным выражениям
Здесь рассматривается практическое использование регулярных выражений для поиска по текстовым файлам.
Начальные условия: Командная строка. Директория test/log с найденными системными журналами.
Скопировать файл журнала rpmpkgs
Среди найденных системных журналов посмотреть файл журнала пакетного менеджера rpm с помощью команды less test/log/rpmpkgs :
Выйти из less можно нажатием клавиши q.
Найти все предупреждения в журнале: строка, начинающаяся с «(WW)». Для этого ввести команду grep "^(WW)" test/log/rpmpkgs:
Получить все строки, содержащие следующий шаблон: последовательность из 1 или более цифры или буквы, затем символ собаки, затем еще одна последовательность 1 или более цифры или буквы или точки, затем символ точки, затем от двух до четырёх букв (имя домена первого уровня). Также служебный вывод ошибок удаляется (перенаправляется в нулевое устройство). Для этого ввести команду grep "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null:
При работе с несколькими файлами grep по умолчанию использует вывод имени файла перед найденной строкой.
Избавиться от имени файла в начале строки с помощью ключа
-h
. Ввести команду grep -h "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null:Для вывода только найденной подстроки используется ключ
-o
. Ввести команду grep -ho "[a-zA-Z0-9]\+@[a-zA-Z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null:Получить все файлы директории
/etc/
с помощью команды find /etc -type f 2>/dev/null, игнорируя ошибки:Для каждого из найденных файлов произвести поиск подстроки «nameserver». Для этого ввести команду find /etc -type f -exec grep "nameserver" {} \; 2>/dev/null:
Для большего удобства добавить вывод имени файла (ключ
-H
) и номера строки (ключ-n
), на которой было найдено совпадение, с помощью команды find /etc -type f -exec grep -Hn "nameserver" {} \; 2>/dev/null:Таким образом, команда grep может эффективно использоваться вместе с командой find для нахождения информации в файлах.
Задания для самостоятельного выполнения
Создайте каталог test1 в домашней директории. Сравните время создания системных каталогов /bin, /tmp с каталогом test1.
Скопируйте файл /bin/ls в локальную директорию. Посмотрите атрибуты этого файла. Попробуйте запустить его.
Создайте в локальной директории символическую ссылку tmplnk на директорию /tmp. Скопируйте несколько файлов в директрию tmplnk.
Сравните файлы /dev/tty1 и /dev/hda1. Какой тип они имеют? Чем они отличаются?
Найдите все файлы в системе, которые были модифицированы не более суток назад.
С помощью одной команды найдите все файлы с расширением .html в директории /usr и скопируйте их в локальную папку htmls.
Создайте архив директории /etc и узнайте его размер. Попробуйте создать сжатый архив той же папки. Сравните степень сжатия gzip и bzip2 на этом примере.
Создайте текстовый файл a.txt из десяти строк. Узнайте его размер. Создайте новый файл, содержащий в себе файл a.txt четыре раза.
С помощью одной команды найдите все файлы с расширением .txt в директории /usr и объедините их в один большой файл big.txt.
Получите с помощью одной команды файл, содержащий все числовые идентификаторы пользователей, зарегистрированных в ситсеме.
Получите с помощью одной команды строки с 5-ой по 8-ю в файле /proc/cpuinfo, содержащем информацию о процессоре.
Придумайте регулярное выражение, соответствующее URL с использованием протокола http. Найдите все строки, содержащие такие URL в файлах директории /etc.
С помощью одной команды найдите все файлы с расширениями .txt или .html в директории /usr, в которых содержится слово user.
Контрольные вопросы
Какие утилиты для архивирования существуют в Linux?
Какие основные различия между файловыми системами Ext2, Ext3 и Ext4?
Как просмотреть информацию о файловой системе, включая индексные дескрипторы, блоки и размер блока?
Как проверить, какие файловые системы уже смонтированы в системе Linux?
Какую команду следует использовать для вывода 25 последних строк файла?
Last updated