Пайпы и конвейеры команд
Соединяем простые команды в мощные цепочки обработки данных.
Пайп (конвейер) — это оператор
|, который передаёт стандартный вывод одной команды на стандартный ввод следующей.
Философия Unix: маленькие команды в цепочке
Unix-команды делают одну вещь, но хорошо. Сила в том, чтобы соединять их пайпами. Вывод левой команды становится вводом правой:
cat access.log | grep ERROR | wc -lЭта цепочка читает лог, оставляет строки со словом ERROR и считает их. Каждая команда не знает о соседях — она просто читает stdin и пишет stdout.
cat access.log
│ stdout
▼
grep ERROR
│ stdout
▼
wc -l ──▶ число строк с ERRORПолезные команды-фильтры
В конвейерах постоянно встречаются sort (сортировка), uniq (схлопывание дубликатов соседних строк), head/tail (начало/конец).
cat names.txt | sort | uniq -c | sort -rn | head -3Вывод:
12 Анна
8 Борис
5 ВераРазберём: отсортировали имена, uniq -c посчитал повторы, ещё раз отсортировали по числу в обратном порядке (-rn), взяли топ-3. Классический способ найти самые частые значения.
Here-doc: подача многострочного текста
Иногда команде нужно подать на вход несколько строк прямо из скрипта. Для этого есть here-doc — блок <<:
cat <<EOF
Строка один
Строка два
EOFВывод:
Строка один Строка два
Всё между <<EOF и закрывающим EOF подаётся в stdin команды. Слово-разделитель может быть любым; если написать <<'EOF' в кавычках, подстановка переменных внутри отключается.
Как работает под капотом
Bash запускает все команды конвейера одновременно, как параллельные процессы, и соединяет их специальным каналом в памяти (pipe). Левый процесс пишет в канал, правый из него читает; когда буфер заполнен, писатель ждёт читателя. Поэтому данные текут «потоком» и не нужно хранить весь результат целиком — конвейер обрабатывает даже гигабайтные логи, не загружая их в память.
Частые ошибки
- Лишний cat.
cat file | grep xизбыточно —grep x fileчитает файл сам. Это называют «бесполезным использованием cat». - uniq без sort.
uniqсхлопывает только СОСЕДНИЕ дубликаты, поэтому почти всегда перед ним ставятsort. - Ловить ошибку только последней команды. Код возврата конвейера — это код последней команды; промежуточные сбои легко пропустить (лечится опцией
pipefail, разберём позже).
Итог
- Пайп
|направляет stdout слева на stdin справа, образуя конвейер. - Команды-фильтры
grep,sort,uniq,headкомбинируются в мощные цепочки. uniqтребует предварительногоsort; here-doc<<EOFподаёт многострочный текст на вход.