6. Пайпы и перенаправление
Философия Unix: маленькие инструменты
Заголовок раздела «Философия Unix: маленькие инструменты»Одна из главных идей Unix — программы должны делать одно дело хорошо и работать вместе. Пайпы — это механизм соединения программ: вывод одной становится вводом другой.
Это как конвейер на заводе: каждый этап обрабатывает деталь и передаёт дальше.
Стандартные потоки
Заголовок раздела «Стандартные потоки»У каждого процесса три стандартных потока:
- stdin (0) — стандартный ввод (обычно клавиатура)
- stdout (1) — стандартный вывод (обычно терминал)
- stderr (2) — стандартный поток ошибок
Перенаправление вывода
Заголовок раздела «Перенаправление вывода»# > перенаправить stdout в файл (перезаписать)ls -la > files.txtecho "Hello" > greeting.txt
# >> добавить в конец файлаecho "Line 1" > log.txtecho "Line 2" >> log.txt # добавит к существующему
# 2> перенаправить stderrcommand 2> errors.txt
# 2>&1 объединить stderr с stdoutcommand > output.txt 2>&1command &> output.txt # короткая форма в bash
# Выбросить вывод в /dev/nullcommand > /dev/null # скрыть stdoutcommand 2>/dev/null # скрыть stderrcommand &>/dev/null # скрыть всёПеренаправление ввода
Заголовок раздела «Перенаправление ввода»# < читать stdin из файлаsort < unsorted.txtwc -l < file.txt
# << Here Document (многострочный ввод)cat << EOFСтрока 1Строка 2EOF
# Запись в файл через here documentcat << EOF > config.txtserver=localhostport=8080EOFПайп соединяет stdout одной команды с stdin другой:
ls -la | grep ".txt" # найти .txt в списке файловps aux | grep nginx # найти процесс nginxcat /etc/passwd | wc -l # посчитать строкиhistory | tail -20 # последние 20 командls | sort | uniq # уникальные имена файловgrep — поиск по тексту
Заголовок раздела «grep — поиск по тексту»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 — обработка текста по полям»# Синтаксис: 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-10awk '$3 > 100' file.txt # строки где 3-е поле > 100awk '{sum += $2} END {print sum}' prices.txt # сумма второй колонки
# Форматированный выводps aux | awk '{printf "%-10s %5s\n", $1, $3}'sed — потоковый редактор
Заголовок раздела «sed — потоковый редактор»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-10sed 's/^/ /' file.txt # добавить отступ в начало каждой строкиsed '/^$/d' file.txt # удалить пустые строкиsort и uniq
Заголовок раздела «sort и uniq»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/logdu -sh /var/log/* 2>/dev/null | sort -rh | head -10
# Список уникальных IP из лога nginxcat /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. Освоив их, ты сможешь решать сложные задачи одной строкой в терминале!