Текстовый редактор vi
В Linux существует множество текстовых редакторов — каждый предназначен для своих задач и соответствует предпочтениям разных пользователей. Это важно, потому что файлы в ОС Linux являются текстовыми: конфигурации, скрипты, логи — всё правится редактором прямо в терминале.
vi — один из наиболее популярных текстовых редакторов в мире UNIX-подобных операционных систем, включая Linux, и один из старейших: первый выпуск — 1976 год. Он установлен практически везде — поэтому уметь в нём работать обязан каждый, кто открывает терминал.
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% документа: файл новый и чистый).
- В левом нижнем углу — символ «минус»
-(не путать с тильдой): он говорит, что мы в командном режиме.
Дальше — типичный цикл работы:
- Нажимаем
i— переходим в режим вставки. Индикатор внизу слева меняется с-наI. - Печатаем текст:
Hello from ICH! - Нажимаем
Esc— выходим из режима вставки, внизу снова-. - Вводим
: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).
^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: из простых утилит собирается мощный инструмент.