Шпаргалка по обработке текста в Linux
grep, sed, awk, ripgrep и jq ускоряют работу в терминале: разбор лог-файлов, извлечение столбцов и преобразование структурированных текстовых данных.
Вы смотрите на лог-файл размером 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
Discover how at OpenReplay.com.
Обработка 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 |
| Парсинг JSON | jq '.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' проходит во вложенный массив, фильтрует по условию и извлекает поле — всё в одной команде.
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