Перейти к содержимому

Практика 1. Знакомство с Linux: терминал и файловая система


Цель работы

Освоить базовую навигацию в терминале Linux, работу с файлами и каталогами, перенаправление потоков и конвейеры.


Часть 1. Навигация по файловой системе

Задание 1.1. Исследование структуры каталогов

  1. Откройте терминал. Определите текущий каталог с помощью pwd.

  2. Перейдите в корневой каталог / и выведите его содержимое:

    Окно терминала
    cd /
    ls -la
  3. Объясните назначение следующих каталогов (используйте man hier или справочные материалы):

    • /bin, /sbin
    • /etc
    • /home
    • /var
    • /tmp
    • /proc
    • /dev
  4. Перейдите в /proc и выполните:

    Окно терминала
    cat /proc/cpuinfo | head -20
    cat /proc/meminfo | head -10
    cat /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. Создание и просмотр файлов

  1. Создайте пустые файлы:

    Окно терминала
    touch ~/project/src/main/app.py
    touch ~/project/src/utils/helpers.py
    touch ~/project/tests/test_app.py
    touch ~/project/docs/README.md
  2. Запишите текст в файл с помощью перенаправления:

    Окно терминала
    echo "#!/usr/bin/env python3" > ~/project/src/main/app.py
    echo "print('Hello, OS course!')" >> ~/project/src/main/app.py
  3. Просмотрите содержимое файла разными способами:

    Окно терминала
    cat ~/project/src/main/app.py
    head -1 ~/project/src/main/app.py
    tail -1 ~/project/src/main/app.py

Задание 2.2. Копирование, перемещение, удаление

  1. Скопируйте файл app.py в каталог tests/:

    Окно терминала
    cp ~/project/src/main/app.py ~/project/tests/app_backup.py
  2. Переименуйте файл:

    Окно терминала
    mv ~/project/tests/app_backup.py ~/project/tests/app_copy.py
  3. Удалите файл и убедитесь, что он удалён:

    Окно терминала
    rm ~/project/tests/app_copy.py
    ls ~/project/tests/
  4. Создайте файл temp.txt в ~/project/, а затем удалите его. Попробуйте удалить несуществующий файл — что выводит система?

Задание 2.3. Подсчёт строк и слов

  1. Скачайте тестовый лог-файл (или создайте самостоятельно):

    Окно терминала
    for i in $(seq 1 1000); do
    echo "$(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.log
    done
  2. Подсчитайте количество строк, слов и байт:

    Окно терминала
    wc ~/project/logs/access.log
    wc -l ~/project/logs/access.log

Часть 3. Перенаправление потоков и конвейеры

Задание 3.1. Потоки ввода-вывода

  1. Перенаправьте стандартный вывод в файл:

    Окно терминала
    ls -la /etc > ~/project/data/raw/etc_listing.txt
  2. Перенаправьте стандартный вывод ошибок:

    Окно терминала
    ls /nonexistent 2> ~/project/logs/errors.log
    cat ~/project/logs/errors.log
  3. Перенаправьте оба потока:

    Окно терминала
    ls /etc /nonexistent > ~/project/data/raw/output.txt 2>&1
  4. Используйте tee для вывода и в файл, и на экран:

    Окно терминала
    ls /etc | tee ~/project/data/raw/etc_list.txt

Задание 3.2. Конвейеры (pipes)

Используя файл access.log, созданный ранее, выполните следующие задания:

  1. Найдите все строки с ошибками:

    Окно терминала
    grep "ERROR" ~/project/logs/access.log
  2. Подсчитайте количество ошибок:

    Окно терминала
    grep -c "ERROR" ~/project/logs/access.log
  3. Извлеките только IP-адреса из лога:

    Окно терминала
    grep -oP '192\.168\.1\.\d+' ~/project/logs/access.log
  4. Найдите топ-5 самых частых IP-адресов:

    Окно терминала
    grep -oP '192\.168\.1\.\d+' ~/project/logs/access.log | sort | uniq -c | sort -rn | head -5
  5. Подсчитайте количество запросов с каждым статусом:

    Окно терминала
    grep -oP 'status=\d+' ~/project/logs/access.log | sort | uniq -c | sort -rn

Часть 4. Поиск файлов и содержимого

Задание 4.1. Команда find

  1. Найдите все файлы .py в каталоге ~/project/:

    Окно терминала
    find ~/project -name "*.py"
  2. Найдите все пустые файлы:

    Окно терминала
    find ~/project -empty
  3. Найдите все каталоги:

    Окно терминала
    find ~/project -type d
  4. Найдите файлы, изменённые за последний час:

    Окно терминала
    find ~/project -mmin -60

Задание 4.2. Команда grep

  1. Найдите строки, содержащие слово “print” во всех .py-файлах:

    Окно терминала
    grep -rn "print" ~/project/src/
  2. Найдите строки, НЕ содержащие “INFO” в логе:

    Окно терминала
    grep -v "INFO" ~/project/logs/access.log | head -10
  3. Найдите строки, соответствующие регулярному выражению (статус 4xx или 5xx):

    Окно терминала
    grep -P 'status=(4|5)\d\d' ~/project/logs/access.log | head -10

Часть 5. Архивация

Задание 5.1. Работа с tar и gzip

  1. Создайте архив каталога ~/project/src:

    Окно терминала
    tar -cvf ~/project/data/src_backup.tar ~/project/src/
  2. Сожмите архив:

    Окно терминала
    gzip ~/project/data/src_backup.tar
    ls -lh ~/project/data/src_backup.tar.gz
  3. Создайте сжатый архив одной командой:

    Окно терминала
    tar -czvf ~/project/data/project_backup.tar.gz ~/project/src/ ~/project/tests/
  4. Просмотрите содержимое архива без распаковки:

    Окно терминала
    tar -tzvf ~/project/data/project_backup.tar.gz
  5. Распакуйте архив в новый каталог:

    Окно терминала
    mkdir ~/project/data/restored
    tar -xzvf ~/project/data/project_backup.tar.gz -C ~/project/data/restored/

Мини-проект: анализ лог-файла

Используя файл ~/project/logs/access.log, напишите последовательность команд (или скрипт), которая:

  1. Выводит общее количество записей в логе.
  2. Выводит количество записей каждого уровня (INFO, WARN, ERROR).
  3. Извлекает и выводит топ-10 IP-адресов по частоте обращений.
  4. Подсчитывает количество запросов с кодами 4xx и 5xx.
  5. Сохраняет все строки с ошибками (ERROR) в отдельный файл ~/project/logs/errors_only.log.
  6. Выводит итоговый отчёт в формате:
=== Отчёт по лог-файлу ===
Всего записей: 1000
INFO: 650
WARN: 200
ERROR: 150
Топ-10 IP-адресов:
15 192.168.1.42
14 192.168.1.78
...
Ответы с ошибками (4xx/5xx): 320
Ошибки сохранены в errors_only.log

Контрольные вопросы

  1. Чем отличается абсолютный путь от относительного? Приведите примеры.
  2. Что делает команда ls -la? Объясните значение каждого столбца в выводе.
  3. Чем отличаются операторы > и >>?
  4. Что такое конвейер (pipe)? Как символ | связывает команды?
  5. Чем find отличается от grep?
  6. Что произойдёт, если выполнить rm -rf /? Почему это опасно?
  7. Зачем нужен tee? Приведите практический пример.
  8. Что делает команда sort | uniq -c | sort -rn? Объясните каждый этап.