📖 Теория: текстовые редакторы vi и nano

⚡ Кратко

vi — один из старейших (1976) и самых популярных редакторов UNIX-подобных систем; его улучшенный клон vim добавил подсветку синтаксиса, многоуровневую отмену и плагины. У vi два режима: командный (клавиши — команды: dd удалить строку, yy скопировать, p вставить, u отменить, / поиск) и режим вставки (обычный набор текста; вход — i, выход — Esc). Сохранить и выйти — :wq, :x или ZZ; выйти без сохранения — :q!. nano — простой редактор без режимов: после запуска сразу печатаете, подсказки внизу экрана (^X Exit = Ctrl+X). Вторая часть лекции — конвейер df -h | grep -w / | awk '{print $5}' | sed 's/%//g' > /tmp/df: получить процент занятости корневого раздела без знака %.

Текстовый редактор vi

В Linux существует множество текстовых редакторов — каждый предназначен для своих задач и соответствует предпочтениям разных пользователей. Это важно, потому что файлы в ОС Linux являются текстовыми: конфигурации, скрипты, логи — всё правится редактором прямо в терминале.

vi — один из наиболее популярных текстовых редакторов в мире UNIX-подобных операционных систем, включая Linux, и один из старейших: первый выпуск — 1976 год. Он установлен практически везде — поэтому уметь в нём работать обязан каждый, кто открывает терминал.

💡 Vim (Vi Improved) — усовершенствованный клон классического редактора vi. Предоставляет мощные возможности редактирования: множество команд, подсветку синтаксиса, расширяемость через плагины, многоуровневый процесс отмены ранее выполненных действий (undo), использование нескольких окон редактирования и многое другое. На современных дистрибутивах команда vi часто запускает именно vim — в современных системах vi часто указывает на vim.

Режимы работы vi

Главное, что отличает vi от привычных редакторов, — режимы:

РежимЧто происходитКак попасть
Командный режим (Command Mode)Клавиши используются для выполнения команд: перемещение по тексту, удаление символов, копирование и вставкаАктивен при запуске; возврат из вставки — Esc
Режим вставки (Insert Mode)Ввод и редактирование текста, как в обычном текстовом редактореКлавиша i в командном режиме

Командный режим ещё называют режимом просмотра: vi ждёт от вас команд, либо вы просто зашли посмотреть на документ.

Основные полезные команды vi

КомандаПояснение
iВойти в режим вставки (режим редактирования), чтобы начать вводить текст; выход из режима вставки — Esc
ZZСохранить файл и выйти из редактора (обязательно БОЛЬШИЕ буквы)
:wСохранить файл, но не выходить из редактора
:wqСохранить файл и выйти из редактора
:xТо же самое, что и :wq — сохранить и выйти
:q!Закрыть файл, отменив все изменения с момента последнего сохранения
G (Shift + G)Перейти к последней строке в файле
/Начать поиск в тексте (ввести текст и Enter; n — следующее совпадение)
uОтменить последнее действие (отменить изменение)
ddУдалить текущую строку (режим вставки не нужен)
yyКопировать текущую строку
pВставить содержимое буфера после текущей строки
DelУдалить один знак (режим вставки не нужен)

vim — мощный и гибкий редактор, но из-за особенностей командного режима он может потребовать времени для освоения.

Первая сессия в vi

Создадим текстовый файл file в папке /tmp и откроем его для редактирования:

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

Что мы видим:

  • Пустой экран редактора — он занимает всю площадь терминала.
  • Тильды ~ слева видны только нам и указывают на пустые строки: на самом деле их в файле нет.
  • Внизу — имя и путь к файлу, позиция курсора (первая строка, 100% документа: файл новый и чистый).
  • В левом нижнем углу — символ «минус» - (не путать с тильдой): он говорит, что мы в командном режиме.
⚠️ Файл существует только после сохранения: если выйти из vi, не сохранив новый файл, — файла не останется.

Дальше — типичный цикл работы:

  1. Нажимаем i — переходим в режим вставки. Индикатор внизу слева меняется с - на I.
  2. Печатаем текст: Hello from ICH!
  3. Нажимаем Esc — выходим из режима вставки, внизу снова -.
  4. Вводим :wq (или ZZ, или :x) — файл сохранён, мы в терминале.

Теперь можно вводить другие команды — например, дописать дату в файл перенаправлением (приём занятия 04) и снова открыть его:

# терминал Ubuntu/JSLinux — дописать дату и проверить в vi
date >> /tmp/file
vi /tmp/file

В открывшемся документе можно изменить содержимое (войти в режим вставки i, заменить ICH на своё имя), а строку с датой удалить целиком: Esc и dd в командном режиме. Передумали — u откатит изменение. Сохраняем и выходим: :wq.

Текстовый редактор nano

nano — это простой текстовый редактор в командной строке, который предоставляет базовый, лёгкий в использовании интерфейс. В отличие от более мощных редакторов, таких как vim, nano не требует изучения сложных комбинаций клавиш — отличный выбор для новичков.

Единственный минус — отсутствие на некоторых дистрибутивах: несмотря на очень маленький размер (около 600 килобайт), некоторые разработчики, собирая дистрибутив, экономят даже на этом и не включают nano в стандартный пакет.

# терминал Ubuntu/JSLinux — запуск nano
nano /tmp/file

Интерфейс nano

  • Сверху — название файла и версия редактора.
  • После входа попадаем сразу в режим редактирования — никаких режимов, можно сразу печатать.
  • Внизу — подсказки: например, как выйти из редактора.
  • Чтобы выйти, нужно нажать Ctrl+X — это и есть подсказка ^X Exit (символ ^ в подсказках означает клавишу Ctrl).
💡 Сохранение в nano: по подсказкам внизу экрана: ^O Write Out (Ctrl+O, затем Enter — подтвердить имя файла) — сохранить; при выходе Ctrl+X с несохранёнными изменениями nano сам спросит «Save modified buffer?» — ответьте Y и Enter. ⚠️ Проверить по документации: лекция показывает только Ctrl+X; полный список горячих клавиш — Ctrl+G (справка) и в документации nano.

Piping: команды df, grep, awk, sed

Закрепим конвейеры из занятия 04 на реальной задаче: получить значение занятого дискового пространства для корневого раздела без знака % (например, число 47) и записать его в отдельный файл. Цепочка преобразований:

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

Разберём каждый этап.

df — сколько занято на дисках

Команда df (от англ. disk free) используется для отображения информации о доступном дисковом пространстве на файловых системах. Наиболее частое использование:

# терминал Ubuntu/JSLinux — диски в человекочитаемом формате
df -h

Ключ -h выводит размеры в человекочитаемом формате — переводя килобайты в мегабайты, гигабайты и т.д. В выводе — таблица: файловая система, размер, занято, доступно, процент использования (Use%), точка монтирования.

grep — поиск по тексту

Команда grep используется для поиска текстовых данных в файлах или выводе других команд:

# терминал Ubuntu/JSLinux — два сценария использования grep
grep "pattern" filename.txt    # поиск строки в файле
ls -l | grep "file"            # поиск в выводе другой команды

У grep множество ключей для точной настройки поиска:

  • -i или --ignore-case — игнорирует регистр символов при поиске;
  • -v или --invert-match — выводит строки, НЕ содержащие совпадений;
  • -w или --word-regexp — ищет только слова целиком, а не части слов;
  • -r / -R или --recursive — поиск рекурсивно в поддиректориях;
  • -A N или --after-context=N — выводит N строк после совпадения;
  • -B N или --before-context=N — выводит N строк перед совпадением;
  • -C N или --context=N — выводит N строк вокруг совпадения.

В нашем конвейере grep быстро фильтрует вывод df -h и оставляет лишь строку с корневым разделом. Обратите внимание на ключ -w: без него мы получили бы все строки с символом / — то есть практически весь вывод, ведь слеш есть в каждом пути монтирования.

awk — работа с колонками

awk — это утилита командной строки и целый язык программирования, который используется для обработки и анализа текстовых данных в файлах и выводе команд. Название — акроним из первых букв фамилий создателей. awk может считывать строки текста, разбивать их на поля (колонки) и выполнять различные операции над этими данными.

В нашем примере строка из df представляется как таблица с одной строкой и 6 колонками, разделёнными пробелами. Нам нужна пятая колонка — процент использования:

# терминал Ubuntu/JSLinux — оставить только 5-ю колонку (Use%)
df -h | grep -w / | awk '{print $5}'
# 47%

sed — потоковый редактор

sed (Stream Editor) — утилита, предназначенная для выполнения текстовых преобразований в потоках данных. sed работает по принципу чтения входных данных построчно и может использоваться для поиска и замены текста: от простой подстановки до удаления и вставки. По умолчанию результат выводится в стандартный вывод (исходный файл не меняется).

# терминал Ubuntu/JSLinux — заменить apple на orange в filename.txt
sed 's/apple/orange/g' filename.txt

Синтаксис 's/apple/orange/g':

  • s — substitute (подмена);
  • /apple/orange/ — между слешами размещаем «что» заменить и «на что» заменить;
  • g — «глобальная» замена: заменить все вхождения шаблона в каждой строке, а не только первое.

Ещё пример — заменить user2 на Ivan в выводе:

# терминал Ubuntu/JSLinux — замена в конвейере (файл не меняется)
cat /etc/group | grep -w user2 | sed 's/user2/ivan/g'

Если нужно перезаписать исходный файл результатом работы sed — добавьте ключ -i и передайте файл, над которым проводятся операции:

# терминал Ubuntu/JSLinux — замена прямо в файле (осторожно!)
sed -i 's/user2/Ivan/g' /etc/group

Итог: конвейер целиком

Вывод df -h был отсортирован и отфильтрован до одного конкретного значения:

# терминал Ubuntu/JSLinux — от таблицы к одному числу
df -h                                              # вся таблица дисков
df -h | grep -w /                                  # только строка корня
df -h | grep -w / | awk '{print $5}'               # только колонка: 47%
df -h | grep -w / | awk '{print $5}' | sed 's/%//g'   # без знака %: 47
df -h | grep -w / | awk '{print $5}' | sed 's/%//g' > /tmp/df  # → в файл

Каждая команда конвейера делает одно маленькое преобразование — в этом и есть философия Linux: из простых утилит собирается мощный инструмент.