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

9. Текстовые инструменты

Большинство данных в Linux — текстовые файлы: конфиги, логи, исходный код. Умение работать с текстом в терминале — обязательный навык.

vim страшит новичков, но это один из самых мощных редакторов. Он есть на любом сервере.

Окно терминала
vim file.txt # открыть файл
vim +42 file.txt # открыть на строке 42
vim +/pattern file # открыть с поиском

vim имеет несколько режимов:

  • Normal — навигация и команды (стартовый режим)
  • Insert — ввод текста
  • Visual — выделение
  • Command — командная строка (:)
i → войти в Insert режим
Esc → вернуться в Normal режим
:w → сохранить
:q → выйти
:wq или ZZ → сохранить и выйти
:q! → выйти без сохранения
:wq! → принудительно сохранить и выйти
# Навигация в Normal режиме
h,j,k,l → влево, вниз, вверх, вправо
gg → начало файла
G → конец файла
:42 → перейти на строку 42
0 → начало строки
$ → конец строки
w → следующее слово
b → предыдущее слово
# Редактирование
dd → удалить строку
yy → скопировать строку
p → вставить
u → отменить (undo)
Ctrl+r → повторить (redo)
. → повторить последнее действие
x → удалить символ
# Поиск
/pattern → найти вперёд (n — следующее)
?pattern → найти назад
:%s/old/new/g → заменить всё в файле
Окно терминала
# Открыть файл и заменить строки
vim -c '%s/localhost/production.server.com/g' -c 'wq' config.yml
# Вставить результат команды в vim
:r !date # вставить текущую дату
:r !ls # вставить список файлов

nano — дружелюбная альтернатива для тех, кто не хочет учить vim.

Окно терминала
nano file.txt # открыть файл
nano +42 file.txt # открыть на строке 42

Подсказки по горячим клавишам видны внизу экрана:

^G — справка (Ctrl+G)
^X — выйти (Ctrl+X)
^O — сохранить (Ctrl+O)
^W — поиск (Ctrl+W)
^K — вырезать строку (Ctrl+K)
^U — вставить (Ctrl+U)
^C — позиция курсора (Ctrl+C)
Окно терминала
# Базовый поиск
grep "error" log.txt # найти строки с "error"
grep -i "error" log.txt # без учёта регистра
# Рекурсивный поиск в проекте
grep -r "TODO" src/ # найти TODO в директории
grep -r --include="*.js" "fetch" . # только в .js файлах
grep -r --exclude="*.min.js" "function" .
# Полезные флаги
grep -n "pattern" file.txt # с номерами строк
grep -l "pattern" *.txt # только имена файлов
grep -L "pattern" *.txt # файлы БЕЗ паттерна
grep -c "pattern" file.txt # количество совпадений
grep -v "pattern" file.txt # инвертированный поиск
# Контекст вокруг совпадений
grep -A 5 "ERROR" log.txt # 5 строк после
grep -B 3 "ERROR" log.txt # 3 строки до
grep -C 2 "ERROR" log.txt # 2 строки с обеих сторон
# Регулярные выражения
grep -E "error|warning|fatal" log.txt # несколько паттернов
grep "^ERROR" log.txt # начало строки
grep "\.js$" filelist.txt # конец строки
grep "[0-9]\{3\}" file.txt # три цифры подряд
grep -P "\d{3}-\d{2}-\d{4}" file.txt # Perl regex
Окно терминала
wc file.txt # строки, слова, байты
wc -l file.txt # только строки
wc -w file.txt # только слова
wc -c file.txt # только байты
wc -m file.txt # символы (с учётом UTF-8)
# Полезные комбинации
ls | wc -l # сколько файлов в директории
grep -r "TODO" src/ | wc -l # сколько TODO в коде
cat log.txt | wc -l # строк в логе
Окно терминала
diff file1.txt file2.txt # сравнить два файла
diff -u file1.txt file2.txt # unified формат (для патчей)
diff -r dir1/ dir2/ # сравнить директории
diff -i file1.txt file2.txt # игнорировать регистр
diff --color file1.txt file2.txt # цветной вывод
# Понимание вывода diff
# < означает строки из первого файла
# > означает строки из второго файла
# --- разделитель
# vimdiff — удобное визуальное сравнение
vimdiff file1.txt file2.txt
Окно терминала
# Создать патч
diff -u original.txt modified.txt > changes.patch
# Применить патч
patch original.txt < changes.patch
patch -p1 < feature.patch # применить к проекту
# Откатить патч
patch -R original.txt < changes.patch
Окно терминала
# cut — вырезать колонки
cut -d: -f1 /etc/passwd # первая колонка (логины)
cut -d, -f2,4 data.csv # 2-я и 4-я колонка CSV
cut -c1-10 file.txt # символы 1-10
# tr — замена символов
echo "Hello World" | tr 'a-z' 'A-Z' # в верхний регистр
echo "Hello" | tr -d 'l' # удалить все 'l'
cat file.txt | tr -s ' ' # схлопнуть пробелы
# tee — писать в файл и stdout
command | tee output.txt # и на экран, и в файл
command | tee -a log.txt # и на экран, и добавить в файл
# column — выровнять таблицу
cat data.csv | column -t -s, # выровнять CSV
# xxd — просмотр в hex
xxd binary.file | head -20
xxd -l 64 file # первые 64 байта
Окно терминала
# 1. Откроем vim и выполним базовые операции
# (если страшно, используй nano)
echo "Line 1\nLine 2\nLine 3" > /tmp/test.txt
vim /tmp/test.txt
# Нажми G (перейти в конец)
# Нажми i (insert)
# Напечатай новую строку
# Нажми Esc, затем :wq
# 2. Поиск в файлах проекта
find . -name "*.md" -exec grep -l "TODO" {} \;
# 3. Статистика по коду
find . -name "*.js" -exec cat {} \; | wc -l
# 4. Сравни два конфига
cp /etc/hosts /tmp/hosts.bak
diff /etc/hosts /tmp/hosts.bak
# 5. Частотный анализ слов в файле
cat file.txt | tr ' ' '\n' | sort | uniq -c | sort -rn | head -10

Освоив текстовые инструменты, ты можешь обрабатывать любые данные прямо в терминале!