135 lines
6.7 KiB
Go
Executable file
135 lines
6.7 KiB
Go
Executable file
package linuxmodules
|
||
|
||
import (
|
||
"fmt"
|
||
"rubric/utils"
|
||
)
|
||
|
||
var StreamsModule = Module{
|
||
Key: "streams",
|
||
Aliases: []string{"st", "io", "потоки"},
|
||
Title: "Стандартные потоки и перенаправление",
|
||
Description: "Тема 11: stdin, stdout, stderr, перенаправление, pipe",
|
||
Run: showStreams,
|
||
}
|
||
|
||
func showStreams() {
|
||
utils.Header("Linux — Стандартные потоки и перенаправление")
|
||
|
||
// ─── 11. Стандартные потоки ───────────────────────────────────
|
||
utils.Section("11. Стандартные потоки (Standard Streams)")
|
||
|
||
utils.Println("Каждый процесс в Linux имеет три стандартных потока ввода-вывода:")
|
||
fmt.Println()
|
||
utils.Code(`Дескриптор Имя Поток По умолчанию
|
||
──────────────────────────────────────────────────────
|
||
0 stdin ввод клавиатура
|
||
1 stdout вывод терминал
|
||
2 stderr вывод ошибок терминал
|
||
|
||
Программа читает из stdin, пишет результат в stdout,
|
||
ошибки — в stderr.`)
|
||
|
||
utils.Println(utils.ColorBold + "Перенаправление вывода (stdout):" + utils.ColorReset)
|
||
utils.Code(`> — перенаправить stdout в файл (перезаписать)
|
||
>> — перенаправить stdout в файл (дописать в конец)
|
||
|
||
ls /etc > list.txt # список файлов → файл
|
||
echo "строка" >> log.txt # дописать в конец
|
||
date > /dev/null # выбросить вывод в никуда`)
|
||
|
||
utils.Println(utils.ColorBold + "Перенаправление ошибок (stderr):" + utils.ColorReset)
|
||
utils.Code(`2> — перенаправить stderr в файл
|
||
2>> — дописать stderr в файл
|
||
2>&1 — направить stderr туда же куда stdout
|
||
|
||
ls /nonexistent 2> errors.txt # ошибки → файл
|
||
ls /etc 1> out.txt 2> err.txt # каждый поток отдельно
|
||
ls /etc /nonexistent > all.txt 2>&1 # всё в один файл
|
||
ls /etc /nonexistent &> all.txt # краткая форма bash
|
||
ls /etc /nonexistent 2>/dev/null # подавить ошибки`)
|
||
|
||
utils.Println(utils.ColorBold + "Перенаправление ввода (stdin):" + utils.ColorReset)
|
||
utils.Code(`< — читать stdin из файла
|
||
|
||
sort < unsorted.txt # отсортировать содержимое файла
|
||
wc -l < file.txt # считать строки из файла
|
||
|
||
# Here-document — передать несколько строк:
|
||
cat << EOF
|
||
строка 1
|
||
строка 2
|
||
EOF
|
||
|
||
# Here-string — передать строку:
|
||
grep 'pattern' <<< "одна строка для поиска"`)
|
||
|
||
utils.Println(utils.ColorBold + "Конвейер (pipe) |:" + utils.ColorReset)
|
||
utils.Println("Pipe передаёт stdout одной команды в stdin следующей.")
|
||
utils.Code(`ls -la | grep '.conf' # только .conf файлы
|
||
cat /etc/passwd | sort # отсортировать passwd
|
||
ps aux | grep nginx # найти процессы nginx
|
||
cat file.txt | wc -l # посчитать строки
|
||
ls /etc | head -10 # первые 10 строк
|
||
history | tail -20 | grep git # цепочка из трёх команд`)
|
||
|
||
utils.Println(utils.ColorBold + "tee — записать и передать дальше:" + utils.ColorReset)
|
||
utils.Code(`# tee читает stdin, пишет в файл И в stdout:
|
||
ls -la | tee listing.txt | grep '.conf'
|
||
|
||
# -a — дописать в файл (append):
|
||
echo "строка" | tee -a log.txt`)
|
||
|
||
utils.Println(utils.ColorBold + "xargs — передать строки как аргументы:" + utils.ColorReset)
|
||
utils.Code(`# find возвращает список файлов, xargs передаёт их rm:
|
||
find /tmp -name '*.tmp' | xargs rm -f
|
||
|
||
# -I{} — подстановка каждой строки в {}:
|
||
cat hosts.txt | xargs -I{} ping -c1 {}
|
||
|
||
# -P4 — параллельно (4 процесса):
|
||
cat urls.txt | xargs -P4 -I{} curl -O {}`)
|
||
|
||
utils.Println(utils.ColorBold + "/dev/null и /dev/zero:" + utils.ColorReset)
|
||
utils.Code(`/dev/null — "чёрная дыра": запись выбрасывается, чтение → EOF
|
||
/dev/zero — бесконечный источник нулевых байт
|
||
/dev/random — случайные байты (медленно, использует энтропию)
|
||
/dev/urandom — псевдослучайные байты (быстро)
|
||
|
||
# Типичные применения:
|
||
command > /dev/null 2>&1 # подавить весь вывод
|
||
dd if=/dev/zero of=file bs=1M count=100 # создать 100МБ файл
|
||
cat /dev/urandom | head -c 16 | base64 # случайный токен`)
|
||
|
||
utils.Println(utils.ColorBold + "Подстановка команд (command substitution):" + utils.ColorReset)
|
||
utils.Code(`# Результат команды используется как аргумент:
|
||
echo "Сегодня: $(date)"
|
||
ls -la $(which python3)
|
||
mkdir backup_$(date +%Y%m%d)
|
||
|
||
# Старый стиль (обратные кавычки):
|
||
echo "Версия: $(uname -r)" # backtick-форма устарела, используйте $()`)
|
||
|
||
utils.Println(utils.ColorBold + "Полезные фильтры для pipe:" + utils.ColorReset)
|
||
utils.Command("grep", "фильтр строк по паттерну")
|
||
utils.Command("sed 's/old/new/g'", "замена текста в потоке")
|
||
utils.Command("awk '{print $1}'", "обработка/вывод полей")
|
||
utils.Command("sort", "сортировка строк")
|
||
utils.Command("uniq", "удаление дубликатов (после sort)")
|
||
utils.Command("head -n N", "первые N строк")
|
||
utils.Command("tail -n N", "последние N строк")
|
||
utils.Command("wc -l", "подсчёт строк")
|
||
utils.Command("tr 'a-z' 'A-Z'", "замена символов")
|
||
utils.Command("cut -d: -f1", "вырезать поле")
|
||
fmt.Println()
|
||
utils.Code(`# Практический пример — топ-5 процессов по памяти:
|
||
ps aux --sort=-%mem | head -6
|
||
|
||
# Все уникальные IP из лога nginx:
|
||
cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20
|
||
|
||
# Подсчёт файлов по расширению:
|
||
find . -type f | sed 's/.*\.//' | sort | uniq -c | sort -rn`)
|
||
|
||
utils.Footer()
|
||
}
|