💻 Примеры: vi, nano и конвейеры в действии

⚡ Минимальный пример

# терминал Ubuntu/JSLinux — весь урок в шести строках
vi /tmp/file        # открыть; i → печатаем → Esc → :wq
date >> /tmp/file   # дописать дату перенаправлением
vi /tmp/file        # dd удалит строку с датой; u — отмена; :wq
nano /tmp/file      # печатаем сразу; Ctrl+O — сохранить, Ctrl+X — выйти
df -h | grep -w / | awk '{print $5}' | sed 's/%//g' > /tmp/df
cat /tmp/df         # 47 ← процент занятости корня без знака %

Пример 1. Полная сессия в vi: от создания до сохранения

# терминал Ubuntu/JSLinux — создаём файл и открываем редактор
vi /tmp/file

Дальше работаем внутри vi (это нажатия клавиш, не команды терминала):

# внутри vi — шаг за шагом
i                  # 1) командный режим → режим вставки (внизу появляется I)
Hello from ICH!    # 2) печатаем текст как в обычном редакторе
<Esc>              # 3) выходим из вставки в командный режим (внизу снова -)
:wq                # 4) сохранить и выйти — мы в терминале

Логика: vi всегда стартует в командном режиме — печатать сразу нельзя. i включает вставку, Esc возвращает в командный режим, и только из него работают команды сохранения. Вместо :wq можно ZZ (большие буквы!) или :x.

Пример 2. Дописали снаружи — отредактировали внутри (dd и u)

# терминал Ubuntu/JSLinux — дозаписываем дату приёмом занятия 04
date >> /tmp/file
cat /tmp/file
# Hello from ICH!
# Wed Jun 10 12:00:00 UTC 2026   ← дата будет ваша

vi /tmp/file       # снова открываем в редакторе
# внутри vi — правим текст и удаляем строку
i                  # вставка: меняем ICH на своё имя
<Esc>              # назад в командный режим
                   # стрелкой ↓ встаём на строку с датой
dd                 # удалить текущую строку (вставка НЕ нужна)
u                  # передумали? u откатывает удаление
dd                 # удаляем снова
:wq                # сохранить и выйти

Логика: dd, yy, p, u — команды командного режима: они работают без перехода во вставку. u отменяет последнее действие — в классическом vi одно, в vim отмена многоуровневая.

Пример 3. Копирование строк: yy и p

# внутри vi — размножаем строку
yy                 # копировать текущую строку в буфер
p                  # вставить буфер ПОСЛЕ текущей строки
p                  # можно вставлять сколько угодно раз
/ICH               # поиск: найти первое вхождение «ICH» (Enter)
n                  # перейти к следующему совпадению
G                  # прыгнуть на последнюю строку файла (Shift+G)
:q!                # выйти, ОТМЕНИВ все изменения с последнего сохранения

Логика: связка yy + p — копипаст без мыши. /текст ищет по файлу, G мгновенно переносит в конец. :q! — аварийный выход: всё, что не сохранено через :w, пропадёт.

Пример 4. Та же задача в nano

# терминал Ubuntu/JSLinux — открываем (или создаём) файл в nano
nano /tmp/file
# внутри nano — никаких режимов
I love nano        # просто печатаем: nano сразу в режиме редактирования
^O  (Ctrl+O) Enter # Write Out: сохранить, Enter подтверждает имя файла
^X  (Ctrl+X)       # Exit: выйти из редактора

Логика: nano дружелюбен: сверху — имя файла и версия, снизу — подсказки (^X Exit означает Ctrl+X). Если выйти по Ctrl+X с несохранёнными изменениями, nano спросит — Y сохранит, N отбросит.

Пример 5. df: смотрим диски человекочитаемо

# терминал Ubuntu/JSLinux
df                 # размеры в блоках — неудобно
df -h              # ключ -h: КБ → МБ/ГБ
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/root        30G   14G   16G  47% /
# tmpfs           2.0G     0  2.0G   0% /dev/shm

Логика: df (disk free) показывает занятость файловых систем; колонка Use% — процент использования, колонка Mounted on — точка монтирования. Нам нужна строка, где точка монтирования — корень /.

Пример 6. grep: фильтруем вывод, ключ -w решает

# терминал Ubuntu/JSLinux
df -h | grep /       # ПЛОХО: слеш есть в каждой строке — фильтр не сработал
df -h | grep -w /    # ХОРОШО: -w ищет слово целиком — только строка корня
# /dev/root        30G   14G   16G  47% /

grep "pattern" filename.txt   # поиск строки в файле
ls -l | grep "file"           # поиск в выводе другой команды
grep -i "root" /etc/group     # -i: без учёта регистра
grep -v "nologin" /etc/passwd # -v: строки БЕЗ совпадения

Логика: grep ищет и в файлах, и в выводе команд через pipe. Без -w шаблон / совпадает с частью любого пути; -w требует совпадения слова целиком — остаётся одна строка корневого раздела.

Пример 7. awk: вырезаем пятую колонку

# терминал Ubuntu/JSLinux
df -h | grep -w / | awk '{print $5}'
# 47%

Логика: awk разбивает строку на поля по пробелам: $1 — файловая система, $2 — размер… $5 — процент использования. '{print $5}' печатает только его. Строка df превратилась в одно значение — но пока со знаком %.

Пример 8. sed: убираем знак % и заменяем слова

# терминал Ubuntu/JSLinux
df -h | grep -w / | awk '{print $5}' | sed 's/%//g'
# 47   ← знак % заменён на «ничего»

# классическая замена слова в файле (вывод — на экран, файл не меняется):
sed 's/apple/orange/g' filename.txt

# замена в конвейере:
cat /etc/group | grep -w user2 | sed 's/user2/ivan/g'

# перезаписать сам файл — ключ -i:
sed -i 's/user2/Ivan/g' /etc/group

Логика: s/%//g — «заменить % на пустую строку, глобально». По умолчанию sed только печатает результат; -i (in place) меняет файл на диске — используйте осторожно (см. документации sed).

Пример 9. Конвейер целиком + запись в файл

# терминал Ubuntu/JSLinux — итоговая цепочка из лекции
df -h | grep -w / | awk '{print $5}' | sed 's/%//g' > /tmp/df
cat /tmp/df
# 47

Логика: четыре утилиты, каждая делает одно преобразование: таблица → строка → колонка → число; перенаправление > (занятие 04) кладёт результат в файл. Так в Linux решаются задачи: маленькие инструменты соединяются в конвейер.

💡 Тренируйтесь безопасно: для экспериментов с vi/nano создавайте файлы в /tmp — эта папка очищается при перезагрузке, и сломать там нечего. А sed -i по системным файлам (/etc/group) выполняйте только в песочнице JSLinux.