Простое определение
sed (Stream EDitor)
«Текстовый хирург» — инструмент для простых операций с текстом: найти и заменить, удалить строки, вставить текст.
bash
# Аналогия: Ножницы и клей для текста sed 's/старое/новое/g' file.txt
awk (Aho, Weinberger, Kernighan)
«Текстовый швейцарский нож» — полноценный язык программирования для сложной обработки табличных данных.
bash
# Аналогия: Excel для командной строки
awk '{print $1, $3}' file.txt
Главные различия в таблице
| Критерий | sed | awk |
|---|---|---|
| Основная задача | Простые замены и фильтрация | Обработка структурированных данных |
| Подход | Строковый (работает со строками) | Полевой (работает с колонками) |
| Сложность | Простой, минималистичный | Сложный, мощный язык |
| Программирование | Ограниченные возможности | Полноценный язык (переменные, условия, циклы) |
| Скорость | Быстрее для простых операций | Медленнее, но мощнее |
Когда что использовать?
✅ Используйте sed, когда нужно:
1. Простая замена текста:
bash
# Заменить слово во всех файлах sed -i 's/error/bug/g' *.log # Удалить пустые строки sed '/^$/d' file.txt # Удалить строки с "debug" sed '/debug/d' file.txt
2. Извлечь диапазон строк:
bash
# Вывести строки с 10 по 20 sed -n '10,20p' file.txt # Вывести от строки с "START" до "END" sed -n '/START/,/END/p' file.txt
3. Простая очистка данных:
bash
# Удалить HTML-теги sed 's/<[^>]*>//g' page.html # Удалить лишние пробелы sed 's/ */ /g' file.txt
✅ Используйте awk, когда нужно:
1. Работать с колонками/полями:
bash
# Вывести 1-ю и 3-ю колонку
awk '{print $1, $3}' data.csv
# Вывести строки, где 2-я колонка > 100
awk '$2 > 100 {print $0}' data.txt
# Посчитать сумму 3-й колонки
awk '{sum += $3} END {print sum}' data.txt
2. Сложная обработка таблиц:
bash
# Среднее значение колонки
awk '{sum += $1; count++} END {print sum/count}' data.txt
# Группировка и агрегация (как в SQL)
awk '{sum[$1] += $2} END {for (i in sum) print i, sum[i]}' sales.txt
# Группирует по первой колонке, суммирует вторую
3. Форматированный вывод:
bash
# Выравнивание колонок
awk '{printf "%-20s %10d\n", $1, $2}' data.txt
# Создание отчета
ps aux | awk 'NR>1 {cpu_sum += $3; mem_sum += $4} END {
print "CPU total:", cpu_sum, "%"
print "MEM total:", mem_sum, "%"
}'
Практические примеры сравнения
Пример 1: Извлечь IP-адреса из логов
sed (просто, но менее точно):
bash
# Найти что-то похожее на IP grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' access.log # или с sed sed -n 's/.*\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/p' access.log
awk (более точный анализ):
bash
# Предположим, IP в 1-й колонке
awk '{print $1}' access.log | sort | uniq -c | sort -nr
# Сразу статистика по IP
awk '{ip_count[$1]++} END {
for (ip in ip_count)
print ip_count[ip], ip
}' access.log | sort -nr
Пример 2: Обработка CSV-файла
Файл employees.csv:
text
ID,Name,Department,Salary 101,Ivan,IT,5000 102,Anna,HR,4500 103,Peter,IT,5500 104,Maria,Sales,4000
sed (только простые замены):
bash
# Заменить запятые на табы sed 's/,/\t/g' employees.csv # Удалить заголовок sed '1d' employees.csv
awk (полноценная обработка):
bash
# Показать только Name и Salary
awk -F',' 'NR>1 {print $2, $4}' employees.csv
# Средняя зарплата по отделам
awk -F',' 'NR>1 {dept[$3] += $4; count[$3]++}
END {for (d in dept) print d, dept[d]/count[d]}' employees.csv
# Фильтр: только IT отдел
awk -F',' '$3 == "IT" {print $0}' employees.csv
Пример 3: Мониторинг процессов
sed (простая фильтрация):
bash
# Найти процессы Chrome ps aux | sed -n '/chrome/p' # Оставить только имя процесса и PID ps aux | sed 's/^[^ ]* *\([0-9]*\).*chrome/pid: \1 chrome/p'
awk (продвинутый анализ):
bash
# Сумма использования памяти Chrome процессами
ps aux | awk '/chrome/ {sum += $4} END {print "Chrome MEM:", sum, "%"}'
# Топ 5 процессов по использованию CPU
ps aux | awk 'NR>1 {print $3, $11}' | sort -nr | head -5
# Группировка по пользователям
ps aux | awk 'NR>1 {cpu[$1] += $3; mem[$1] += $4}
END {for (u in cpu) print u, cpu[u] "% CPU", mem[u] "% MEM"}'
Совместное использование
Часто sed и awk используют вместе, каждый для своей задачи:
bash
# Сначала sed очищает данные, потом awk анализирует
cat dirty.log | sed 's/ */ /g' | sed '/^#/d' | awk '{print $1, $5}'
# Или наоборот - awk обрабатывает, sed форматирует
awk '{sum += $2} END {print sum}' data.txt | sed 's/$/ рублей/'
Правила выбора
Выбирайте sed, если:
- Нужно просто заменить текст
- Нужно удалить строки по шаблону
- Работаете с неструктурированным текстом
- Хотите быстро сделать простую операцию
Выбирайте awk, если:
- Работаете с табличными данными (CSV, логи, TSV)
- Нужна арифметика (суммы, средние)
- Нужна группировка данных (как GROUP BY в SQL)
- Нужны сложные условия и логика
- Нужно форматировать вывод (как printf)
Простая аналогия
Представьте, что у вас есть текст:
text
Яблоки 100 Бананы 50 Яблоки 200 Апельсины 150
sed спросит: «Что заменить или удалить?»
bash
# Заменить "Яблоки" на "Apples" sed 's/Яблоки/Apples/g'
awk спросит: «Что вы хотите посчитать?»
bash
# Сумма по фруктам
awk '{sum[$1] += $2} END {for (f in sum) print f, sum[f]}'
# Apples 300
# Бананы 50
# Апельсины 150
Мини-чеклист для выбора
text
Ваша задача: ├── Замена текста? → sed ├── Удаление строк? → sed ├── Извлечение строк? → sed ├── Работа с колонками? → awk ├── Расчеты/суммы? → awk ├── Группировка данных? → awk └── Сложная логика? → awk
Итог
sed— ваш выбор для быстрых текстовых правок (90% случаев хватит одной команды)awk— ваш выбор для анализа данных (фактически, Excel в командной строке)
Простейшее правило: Если нужно сделать что-то с целыми строками — sed. Если нужно что-то с отдельными колонками/полями — awk.