12k
All articles

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

grep, sed, awk, ripgrep и jq ускоряют работу в терминале: разбор лог-файлов, извлечение столбцов и преобразование структурированных текстовых данных.

OpenReplay Team
OpenReplay Team
Шпаргалка по обработке текста в 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. Оператор конвейера (|) связывает всё вместе, позволяя вам составлять небольшие, целенаправленные команды в конвейеры, которые не уступают специализированным скриптам.

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

Когда следует использовать awk вместо cut для извлечения столбцов?

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

Является ли ripgrep полной заменой grep?

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

Как избежать повреждения файла при редактировании на месте с помощью sed?

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

Может ли jq обрабатывать вложенный JSON и массивы?

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

Open-source session replay

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.

Star on GitHub12k

We use cookies to improve your experience. By using our site, you accept cookies.