Практика 1. Знакомство с Linux: терминал и файловая система
Цель работы
Освоить базовую навигацию в терминале Linux, работу с файлами и каталогами, перенаправление потоков и конвейеры.
Часть 1. Навигация по файловой системе
Задание 1.1. Исследование структуры каталогов
-
Откройте терминал. Определите текущий каталог с помощью
pwd. -
Перейдите в корневой каталог
/и выведите его содержимое:Окно терминала cd /ls -la -
Объясните назначение следующих каталогов (используйте
man hierили справочные материалы):/bin,/sbin/etc/home/var/tmp/proc/dev
-
Перейдите в
/procи выполните:Окно терминала cat /proc/cpuinfo | head -20cat /proc/meminfo | head -10cat /proc/versionКакую информацию выводит каждая из этих команд?
Задание 1.2. Создание структуры каталогов
Создайте следующую структуру каталогов для учебного проекта:
~/project/├── src/│ ├── main/│ └── utils/├── tests/├── docs/├── data/│ ├── raw/│ └── processed/└── logs/Используйте одну команду:
mkdir -p ~/project/{src/{main,utils},tests,docs,data/{raw,processed},logs}Проверьте структуру командой tree ~/project (установите tree, если отсутствует: sudo apt install tree).
Часть 2. Работа с файлами
Задание 2.1. Создание и просмотр файлов
-
Создайте пустые файлы:
Окно терминала touch ~/project/src/main/app.pytouch ~/project/src/utils/helpers.pytouch ~/project/tests/test_app.pytouch ~/project/docs/README.md -
Запишите текст в файл с помощью перенаправления:
Окно терминала echo "#!/usr/bin/env python3" > ~/project/src/main/app.pyecho "print('Hello, OS course!')" >> ~/project/src/main/app.py -
Просмотрите содержимое файла разными способами:
Окно терминала cat ~/project/src/main/app.pyhead -1 ~/project/src/main/app.pytail -1 ~/project/src/main/app.py
Задание 2.2. Копирование, перемещение, удаление
-
Скопируйте файл
app.pyв каталогtests/:Окно терминала cp ~/project/src/main/app.py ~/project/tests/app_backup.py -
Переименуйте файл:
Окно терминала mv ~/project/tests/app_backup.py ~/project/tests/app_copy.py -
Удалите файл и убедитесь, что он удалён:
Окно терминала rm ~/project/tests/app_copy.pyls ~/project/tests/ -
Создайте файл
temp.txtв~/project/, а затем удалите его. Попробуйте удалить несуществующий файл — что выводит система?
Задание 2.3. Подсчёт строк и слов
-
Скачайте тестовый лог-файл (или создайте самостоятельно):
Окно терминала for i in $(seq 1 1000); doecho "$(date +%Y-%m-%d) $(shuf -n1 -e INFO WARN ERROR) request from 192.168.1.$((RANDOM % 255)) status=$(shuf -n1 -e 200 301 404 500)" >> ~/project/logs/access.logdone -
Подсчитайте количество строк, слов и байт:
Окно терминала wc ~/project/logs/access.logwc -l ~/project/logs/access.log
Часть 3. Перенаправление потоков и конвейеры
Задание 3.1. Потоки ввода-вывода
-
Перенаправьте стандартный вывод в файл:
Окно терминала ls -la /etc > ~/project/data/raw/etc_listing.txt -
Перенаправьте стандартный вывод ошибок:
Окно терминала ls /nonexistent 2> ~/project/logs/errors.logcat ~/project/logs/errors.log -
Перенаправьте оба потока:
Окно терминала ls /etc /nonexistent > ~/project/data/raw/output.txt 2>&1 -
Используйте
teeдля вывода и в файл, и на экран:Окно терминала ls /etc | tee ~/project/data/raw/etc_list.txt
Задание 3.2. Конвейеры (pipes)
Используя файл access.log, созданный ранее, выполните следующие задания:
-
Найдите все строки с ошибками:
Окно терминала grep "ERROR" ~/project/logs/access.log -
Подсчитайте количество ошибок:
Окно терминала grep -c "ERROR" ~/project/logs/access.log -
Извлеките только IP-адреса из лога:
Окно терминала grep -oP '192\.168\.1\.\d+' ~/project/logs/access.log -
Найдите топ-5 самых частых IP-адресов:
Окно терминала grep -oP '192\.168\.1\.\d+' ~/project/logs/access.log | sort | uniq -c | sort -rn | head -5 -
Подсчитайте количество запросов с каждым статусом:
Окно терминала grep -oP 'status=\d+' ~/project/logs/access.log | sort | uniq -c | sort -rn
Часть 4. Поиск файлов и содержимого
Задание 4.1. Команда find
-
Найдите все файлы
.pyв каталоге~/project/:Окно терминала find ~/project -name "*.py" -
Найдите все пустые файлы:
Окно терминала find ~/project -empty -
Найдите все каталоги:
Окно терминала find ~/project -type d -
Найдите файлы, изменённые за последний час:
Окно терминала find ~/project -mmin -60
Задание 4.2. Команда grep
-
Найдите строки, содержащие слово “print” во всех
.py-файлах:Окно терминала grep -rn "print" ~/project/src/ -
Найдите строки, НЕ содержащие “INFO” в логе:
Окно терминала grep -v "INFO" ~/project/logs/access.log | head -10 -
Найдите строки, соответствующие регулярному выражению (статус 4xx или 5xx):
Окно терминала grep -P 'status=(4|5)\d\d' ~/project/logs/access.log | head -10
Часть 5. Архивация
Задание 5.1. Работа с tar и gzip
-
Создайте архив каталога
~/project/src:Окно терминала tar -cvf ~/project/data/src_backup.tar ~/project/src/ -
Сожмите архив:
Окно терминала gzip ~/project/data/src_backup.tarls -lh ~/project/data/src_backup.tar.gz -
Создайте сжатый архив одной командой:
Окно терминала tar -czvf ~/project/data/project_backup.tar.gz ~/project/src/ ~/project/tests/ -
Просмотрите содержимое архива без распаковки:
Окно терминала tar -tzvf ~/project/data/project_backup.tar.gz -
Распакуйте архив в новый каталог:
Окно терминала mkdir ~/project/data/restoredtar -xzvf ~/project/data/project_backup.tar.gz -C ~/project/data/restored/
Мини-проект: анализ лог-файла
Используя файл ~/project/logs/access.log, напишите последовательность команд (или скрипт), которая:
- Выводит общее количество записей в логе.
- Выводит количество записей каждого уровня (INFO, WARN, ERROR).
- Извлекает и выводит топ-10 IP-адресов по частоте обращений.
- Подсчитывает количество запросов с кодами 4xx и 5xx.
- Сохраняет все строки с ошибками (ERROR) в отдельный файл
~/project/logs/errors_only.log. - Выводит итоговый отчёт в формате:
=== Отчёт по лог-файлу ===Всего записей: 1000INFO: 650WARN: 200ERROR: 150
Топ-10 IP-адресов: 15 192.168.1.42 14 192.168.1.78 ...
Ответы с ошибками (4xx/5xx): 320Ошибки сохранены в errors_only.logКонтрольные вопросы
- Чем отличается абсолютный путь от относительного? Приведите примеры.
- Что делает команда
ls -la? Объясните значение каждого столбца в выводе. - Чем отличаются операторы
>и>>? - Что такое конвейер (pipe)? Как символ
|связывает команды? - Чем
findотличается отgrep? - Что произойдёт, если выполнить
rm -rf /? Почему это опасно? - Зачем нужен
tee? Приведите практический пример. - Что делает команда
sort | uniq -c | sort -rn? Объясните каждый этап.