Back

Шпаргалка по обработке текста в Linux

Шпаргалка по обработке текста в Linux

Вы смотрите на лог-файл размером 2 ГБ в поисках неудачных API-вызовов за последний час. Или вам нужно извлечь email-адреса из CSV-экспорта. Эти задачи не должны требовать написания Python-скрипта.

Эта шпаргалка охватывает основные команды Linux для обработки текста — grep, awk, sed и их современные аналоги — с практическими примерами для повседневных задач frontend и full-stack разработки.

Ключевые моменты

  • grep и ripgrep — ваши основные инструменты для поиска текста в файлах, причём ripgrep обеспечивает прирост скорости и учитывает .gitignore для больших кодовых баз.
  • sed выполняет потоковые операции поиска и замены, но следите за различиями в поведении между версиями GNU и BSD.
  • awk превосходно справляется с обработкой столбцов в логах, CSV и других структурированных текстах.
  • jq заполняет пробел, который оставляют grep и awk при работе с JSON-данными.
  • Оператор конвейера (|) — это связующее звено, которое объединяет эти команды в мощные композируемые конвейеры.

Основные команды поиска: grep и ripgrep

grep ищет шаблоны в файлах и выводит совпадающие строки. Это основа любого конвейера обработки текста.

# Базовый поиск по шаблону
grep "error" server.log

# Поиск без учёта регистра
grep -i "warning" app.log

# Показать номера строк
grep -n "TODO" src/*.js

# Инвертированное совпадение (строки, НЕ содержащие шаблон)
grep -v "debug" output.log

# Расширенные регулярные выражения (-E включает +, ?, |, и группировку)
grep -E "error|warning|fatal" app.log

# Подсчитать только совпадения
grep -c "404" access.log

ripgrep (rg) — это более быстрая альтернатива, которая по умолчанию учитывает .gitignore:

# Рекурсивный поиск (поведение по умолчанию)
rg "useState" ./src

# Поиск по определённым типам файлов
rg -t js "async function"

# Показать контекст вокруг совпадений
rg -C 3 "Exception" logs/

Для больших кодовых баз ripgrep обычно работает в 2–5 раз быстрее, чем grep, и автоматически пропускает нерелевантные файлы.

Преобразование текста с помощью sed

sed выполняет потоковое редактирование — операции поиска и замены без открытия файла в редакторе.

# Заменить первое вхождение в каждой строке
sed 's/http/https/' urls.txt

# Заменить все вхождения (флаг global)
sed 's/old/new/g' config.txt

# Удалить строки, соответствующие шаблону
sed '/^#/d' config.ini

# Редактирование на месте (GNU sed)
sed -i 's/localhost/127.0.0.1/g' .env

# macOS/BSD требует пустого расширения для резервной копии
sed -i '' 's/localhost/127.0.0.1/g' .env

Примечание: Поведение флага -i различается между GNU и BSD sed. В macOS всегда указывайте пустую строку (-i '') или задавайте расширение для резервной копии (например, -i .bak).

Обработка столбцов с помощью awk

awk превосходно работает со структурированным текстом — логами, CSV и данными, разделёнными пробелами. POSIX awk портативно справляется с большинством распространённых задач.

# Вывести определённые столбцы
awk '{print $1, $4}' access.log

# Пользовательский разделитель полей (CSV)
awk -F',' '{print $2}' data.csv

# Фильтрация по условию
awk '$3 > 500 {print $1, $3}' response_times.log

# Суммировать столбец
awk '{sum += $2} END {print sum}' sales.csv

# Блоки BEGIN/END для заголовков
awk 'BEGIN {print "User\tCount"} {print $1, $2}' stats.txt

Основные вспомогательные команды

# Сортировка и удаление дубликатов (с подсчётом, по убыванию)
sort access.log | uniq -c | sort -rn

# Извлечь столбцы по разделителю
cut -d',' -f1,3 users.csv

# Преобразование символов (нижний регистр в верхний)
tr '[:lower:]' '[:upper:]' < input.txt

# Подсчитать строки в файле
wc -l package.json

# Найти файлы по шаблону имени
find ./src -name "*.test.js" -type f

Обработка JSON с помощью jq

Для современной веб-разработки jq обрабатывает JSON-парсинг, с которым grep и awk не справляются чисто:

# Извлечь поле
jq '.data.users' response.json

# Фильтровать элементы массива
jq '.items[] | select(.status == "active")' data.json

# Форматировать ответ API
curl -s https://api.example.com/users | jq '.[].email'

Обратите внимание, что первый пример выше избегает бесполезного использования cat. jq может читать файлы напрямую, поэтому cat response.json | jq '...' не нужен.

Практические примеры конвейеров

Отфильтровать сегодняшние ошибки из логов:

grep "$(date +%Y-%m-%d)" app.log | grep -i error | awk '{print $4, $5}'

Извлечь уникальные IP-адреса:

awk '{print $1}' access.log | sort -u

Найти самые большие файлы в проекте по количеству строк:

find . -type f -name "*.js" -exec wc -l {} + | sort -rn | head -10

Очистить CSV-данные (извлечь столбцы, убрать кавычки, удалить дубликаты):

cut -d',' -f2,4 export.csv | sed 's/"//g' | sort -u

Краткий справочник

ЗадачаКоманда
Поиск по шаблонуgrep "pattern" file
Быстрый рекурсивный поискrg "pattern"
Замена текстаsed 's/old/new/g' file
Извлечение столбцовawk '{print $1}' file
Парсинг JSONjq '.key' file.json
Сортировка и удаление дубликатовsort -u file
Подсчёт строкwc -l file

Заключение

Освойте эти команды Linux для обработки текста, и вы сможете выполнять большинство задач по анализу логов, извлечению данных и преобразованию файлов прямо из терминала. Начните с grep для поиска, добавьте awk для работы со столбцами и обращайтесь к jq, когда дело касается JSON. Оператор конвейера (|) связывает всё вместе, позволяя вам составлять небольшие, целенаправленные команды в конвейеры, которые не уступают специализированным скриптам.

Часто задаваемые вопросы

Используйте cut, когда ваши данные имеют постоянный односимвольный разделитель и вам нужно просто получить определённые поля. Обращайтесь к awk, когда нужно фильтровать строки по условию, выполнять арифметические операции или обрабатывать нерегулярные пробелы. awk по умолчанию рассматривает последовательные пробелы как один разделитель, что делает его более снисходительным к лог-файлам и выводу команд.

Для большинства рабочих процессов разработчиков — да. ripgrep быстрее, учитывает .gitignore и использует разумные настройки по умолчанию, такие как рекурсивный поиск. Однако grep доступен практически на каждой Unix-системе по умолчанию, что делает его более безопасным выбором для портативных shell-скриптов. Если вы пишете скрипты, предназначенные для работы на минимальных серверах или в контейнерах, придерживайтесь grep.

Всегда сначала тестируйте команду sed без флага -i, чтобы просмотреть вывод в терминале. Когда будете готовы редактировать на месте, используйте расширение для резервной копии, например sed -i .bak в системах GNU. В macOS или BSD синтаксис — sed -i .bak. Это создаёт копию исходного файла перед применением изменений, давая вам возможность отката.

Да. jq создан для навигации по глубоко вложенным структурам. Используйте точечную нотацию для обхода объектов, квадратные скобки для массивов и выражения с конвейером для цепочки фильтров. Например, jq '.data.users[] | select(.active == true) | .email' проходит во вложенный массив, фильтрует по условию и извлекает поле — всё в одной команде.

Gain control over your UX

See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay