Разница между sed и awk простым языком с практическими примерами.

Простое определение

sed (Stream EDitor)

«Текстовый хирург» — инструмент для простых операций с текстом: найти и заменить, удалить строки, вставить текст.

bash

# Аналогия: Ножницы и клей для текста
sed 's/старое/новое/g' file.txt

awk (Aho, Weinberger, Kernighan)

«Текстовый швейцарский нож» — полноценный язык программирования для сложной обработки табличных данных.

bash

# Аналогия: Excel для командной строки
awk '{print $1, $3}' file.txt

Главные различия в таблице

Критерийsedawk
Основная задачаПростые замены и фильтрацияОбработка структурированных данных
ПодходСтроковый (работает со строками)Полевой (работает с колонками)
СложностьПростой, минималистичныйСложный, мощный язык
ПрограммированиеОграниченные возможностиПолноценный язык (переменные, условия, циклы)
СкоростьБыстрее для простых операцийМедленнее, но мощнее

Когда что использовать?

✅ Используйте 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, если:

  1. Нужно просто заменить текст
  2. Нужно удалить строки по шаблону
  3. Работаете с неструктурированным текстом
  4. Хотите быстро сделать простую операцию

Выбирайте awk, если:

  1. Работаете с табличными данными (CSV, логи, TSV)
  2. Нужна арифметика (суммы, средние)
  3. Нужна группировка данных (как GROUP BY в SQL)
  4. Нужны сложные условия и логика
  5. Нужно форматировать вывод (как 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.

Оставьте комментарий