Перейти к содержимому

6. Пайпы и перенаправление

Одна из главных идей Unix — программы должны делать одно дело хорошо и работать вместе. Пайпы — это механизм соединения программ: вывод одной становится вводом другой.

Это как конвейер на заводе: каждый этап обрабатывает деталь и передаёт дальше.

У каждого процесса три стандартных потока:

  • stdin (0) — стандартный ввод (обычно клавиатура)
  • stdout (1) — стандартный вывод (обычно терминал)
  • stderr (2) — стандартный поток ошибок
Окно терминала
# > перенаправить stdout в файл (перезаписать)
ls -la > files.txt
echo "Hello" > greeting.txt
# >> добавить в конец файла
echo "Line 1" > log.txt
echo "Line 2" >> log.txt # добавит к существующему
# 2> перенаправить stderr
command 2> errors.txt
# 2>&1 объединить stderr с stdout
command > output.txt 2>&1
command &> output.txt # короткая форма в bash
# Выбросить вывод в /dev/null
command > /dev/null # скрыть stdout
command 2>/dev/null # скрыть stderr
command &>/dev/null # скрыть всё
Окно терминала
# < читать stdin из файла
sort < unsorted.txt
wc -l < file.txt
# << Here Document (многострочный ввод)
cat << EOF
Строка 1
Строка 2
EOF
# Запись в файл через here document
cat << EOF > config.txt
server=localhost
port=8080
EOF

Пайп соединяет stdout одной команды с stdin другой:

Окно терминала
ls -la | grep ".txt" # найти .txt в списке файлов
ps aux | grep nginx # найти процесс nginx
cat /etc/passwd | wc -l # посчитать строки
history | tail -20 # последние 20 команд
ls | sort | uniq # уникальные имена файлов
Окно терминала
grep "pattern" file.txt # найти строки с паттерном
grep -i "error" log.txt # игнорировать регистр
grep -n "TODO" code.js # показывать номера строк
grep -r "function" src/ # рекурсивный поиск в директории
grep -l "import" *.js # только имена файлов
grep -v "comment" file.txt # инвертировать (строки БЕЗ паттерна)
grep -c "error" log.txt # посчитать совпадения
grep -A 3 "error" log.txt # 3 строки после совпадения
grep -B 2 "error" log.txt # 2 строки до совпадения
grep -E "error|warning" log.txt # расширенные регулярки
grep "^user" /etc/passwd # строки начинающиеся с "user"
grep "\.js$" file.txt # строки заканчивающиеся на ".js"
Окно терминала
# Синтаксис: awk 'условие { действие }' файл
awk '{print $1}' file.txt # вывести первое поле
awk '{print $1, $3}' file.txt # первое и третье поля
awk -F: '{print $1}' /etc/passwd # разделитель : (вывести логины)
awk 'NR==5' file.txt # пятая строка
awk 'NR>=5 && NR<=10' file.txt # строки 5-10
awk '$3 > 100' file.txt # строки где 3-е поле > 100
awk '{sum += $2} END {print sum}' prices.txt # сумма второй колонки
# Форматированный вывод
ps aux | awk '{printf "%-10s %5s\n", $1, $3}'
Окно терминала
sed 's/old/new/' file.txt # заменить первое вхождение в строке
sed 's/old/new/g' file.txt # заменить все вхождения
sed -i 's/old/new/g' file.txt # изменить файл на месте
sed -i.bak 's/old/new/g' file.txt # с бэкапом
sed '/pattern/d' file.txt # удалить строки с паттерном
sed -n '5,10p' file.txt # вывести строки 5-10
sed 's/^/ /' file.txt # добавить отступ в начало каждой строки
sed '/^$/d' file.txt # удалить пустые строки
Окно терминала
sort file.txt # сортировка по алфавиту
sort -r file.txt # обратная сортировка
sort -n numbers.txt # числовая сортировка
sort -k2 file.txt # сортировать по 2-му полю
sort -t: -k3 -n /etc/passwd # по 3-му полю, разделитель :
uniq file.txt # убрать соседние дубликаты
uniq -c file.txt # посчитать количество вхождений
uniq -d file.txt # только дублирующиеся строки
uniq -u file.txt # только уникальные строки
# Классическая комбинация
sort file.txt | uniq # убрать все дубликаты
sort file.txt | uniq -c | sort -rn # частотный анализ
Окно терминала
# Топ-10 самых больших файлов в /var/log
du -sh /var/log/* 2>/dev/null | sort -rh | head -10
# Список уникальных IP из лога nginx
cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20
# Найти все TODO в коде
grep -rn "TODO\|FIXME\|HACK" src/ --include="*.js"
# Посчитать строки кода по расширениям
find . -name "*.js" -exec wc -l {} + | sort -rn | head
# Замена в нескольких файлах
find . -name "*.md" -exec sed -i 's/old_url/new_url/g' {} \;
# Парсинг CSV: третья колонка, убрать заголовок, отсортировать
tail -n +2 data.csv | cut -d',' -f3 | sort | uniq -c | sort -rn
# Мониторинг логов в реальном времени с фильтром
tail -f /var/log/app.log | grep --line-buffered "ERROR"

Пайпы — это суперсила Linux. Освоив их, ты сможешь решать сложные задачи одной строкой в терминале!