3. I/O Redirection va Pipelines
Unix falsafasining eng kuchli g'oyasi:
"Bitta vazifani yaxshi bajaradigan kichik dasturlarni yozing va ularni bir-biri bilan bog'lab, murakkab vazifalarni hal qiling."
Aynan redirection va pipes shu g'oyani amalga oshiradi.
3.1. Uchta standart oqim
Har bir Unix jarayonida 3 ta standart oqim mavjud:
| Oqim | Raqam | Ma'nosi |
|---|---|---|
stdin | 0 | Kirish (klaviaturadan yoki fayldan) |
stdout | 1 | Chiqish (ekranga normal natija) |
stderr | 2 | Xatoliklar oqimi |
flowchart LR
A[stdin 0] --> B[Buyruq]
B --> C[stdout 1]
B --> D[stderr 2]echo "Salom" buyrug'i Salom matnini stdout'ga yozadi. ls /yoq esa xatolikni stderr'ga yozadi.
3.2. > — chiqishni faylga yo'naltirish
> operatori stdoutni faylga yo'naltiradi. Fayl mavjud bo'lsa, ustiga yoziladi (overwrite).
echo "Salom dunyo" > hello.txt
cat hello.txt
# Salom dunyo
ls > files.txt
# joriy katalog tarkibi files.txt ichidaDiqqat: overwrite!
> har safar eski mazmunni o'chiradi. Agar faylda muhim ma'lumot bo'lsa, ehtiyot bo'ling.
3.3. >> — faylga qo'shib yozish
>> operatori faylga append qiladi (oxiriga qo'shib boradi):
echo "Birinchi qator" > log.txt
echo "Ikkinchi qator" >> log.txt
echo "Uchinchi qator" >> log.txt
cat log.txt
# Birinchi qator
# Ikkinchi qator
# Uchinchi qatorLog fayllar uchun ideal
Skriptlar log yozayotganda har doim >> ishlatiladi:
echo "[$(date)] Backup boshlandi" >> /var/log/backup.log3.4. < — fayldan o'qish (stdin redirect)
< operatori faylni stdin sifatida buyruqqa beradi:
# Klassik usul
cat < file.txt
# Misol: wc bilan qatorlar sonini sanash
wc -l < /etc/passwd
# Skript ichida foydalanuvchi inputini fayldan o'qish
while read -r line; do
echo "Qator: $line"
done < input.txtFarqi
cat file.txt—catga argument sifatida fayl beriladicat < file.txt—catning stdin'iga fayl yo'naltiriladi
Natijasi bir xil bo'lishi mumkin, lekin mexanizmi farqli.
3.5. 2> — xatoliklarni yo'naltirish
stderr boshqacha — uni alohida yo'naltirish kerak:
# Faqat xatolarni faylga
ls /yoq-fayl 2> errors.log
# Stdout'ni faylga, stderr'ni ekranga
ls /etc /yoq-fayl > out.txt
# stdout fayl ichida, stderr ekranda
# Stderr'ni "yo'q" qilish
ls /yoq-fayl 2>/dev/null/dev/null — qora tuynuk
/dev/null — bu maxsus fayl. Unga yozilgan har qanday narsa yo'qoladi. Keraksiz outputni "yutib yuborish" uchun ishlatiladi.
3.6. 2>&1 — stderr'ni stdout'ga qo'shish
Eng ko'p chalkashtiradigan, lekin eng kuchli sintaksis:
# Stdout VA stderr ni bitta faylga
command > output.log 2>&1
# Bash 4+ uchun qisqaroq variant
command &> output.log
# Stdout va stderr ni butunlay yo'q qilish
command > /dev/null 2>&1
command &>/dev/nullTartib muhim!
> file 2>&1 — to'g'ri (avval stdout faylga, keyin stderr stdout'ga) 2>&1 > file — XATO (stderr ekranga, faqat stdout faylga ketadi)
3.7. Pipe | — buyruqlarni zanjirlash
Pipe (|) — bitta buyruqning stdoutini ikkinchi buyruqning stdiniga ulaydi.
flowchart LR
A[buyruq1] -->|stdout| B[buyruq2] -->|stdout| C[buyruq3]Klassik misol:
ls -l | grep ".md"
# faqat .md bilan tugaydigan qatorlarcat access.log | grep "404" | wc -l
# access.log'da nechta 404 xatolik borps aux | grep python | grep -v grep
# python jarayonlari (grep o'zini ko'rsatmaydi)history | sort | uniq -c | sort -rn | head -10
# eng ko'p ishlatilgan 10 ta buyruqUnix falsafasi
Bitta vazifani bajaradigan kichik buyruqlarni | orqali ulab, murakkab muammolarni hal qilamiz.
3.8. tee — ikkala tomonga yozish
tee stdindan o'qiydi va stdoutga ham, faylga ham yozadi. Nomi suvni "T-shaped" trubadan o'tkazishga ishora qiladi.
# Natijani ham ekranga, ham faylga
ls -l | tee files.txt
# Faylga append qilib
echo "yangi qator" | tee -a log.txt
# Sudo bilan birga ishlatish
echo "127.0.0.1 myapp.local" | sudo tee -a /etc/hostssudo va > muammosi
Bu ishlamaydi:
sudo echo "x" > /etc/protected.conf # ❌ Permission deniedSababi: > shell tomonidan, sudosiz bajariladi. To'g'ri yo'l:
echo "x" | sudo tee -a /etc/protected.conf # ✅3.9. Here Document (<<) — ko'p qatorli input
<< orqali fayl yaratmasdan, terminaldagi matnni stdin sifatida berish mumkin:
cat << EOF
Salom, dunyo!
Bu bir nechta qator.
$(date) — joriy vaqt
EOFEOF (yoki istalgan so'z) — chegara belgisi. Uning ichidagi $o'zgaruvchi va $(buyruq) ifodalari bajariladi.
Agar bajarilmasin desangiz, EOF'ni qo'shtirnoq ichiga oling:
cat << 'EOF'
$HOME shu holicha qoladi
EOF3.10. Here String (<<<) — bir qatorli input
grep "uzbek" <<< "men o'zbekman"
# men o'zbekman
bc <<< "5 + 7"
# 123.11. Process substitution <(...) va >(...)
Buyruqning chiqishini xuddi fayldek ishlatish mumkin:
# Ikkita buyruq natijasini taqqoslash
diff <(ls dir1) <(ls dir2)
# Ikki tartiblangan faylni birlashtirish
sort -m <(sort a.txt) <(sort b.txt)Klassik fayl o'rniga
Bu xususiyat vaqtinchalik fayllarni yaratmasdan, dasturlarni "go'yo fayl" kabi ulashga yordam beradi.
3.12. Real misollar
Misol 1: Disk bandligini topish
du -sh * 2>/dev/null | sort -hr | head -5
# joriy katalogdagi eng katta 5 ta elementMisol 2: Log fayllar tahlili
grep "ERROR" /var/log/app.log \
| awk '{print $1}' \
| sort \
| uniq -c \
| sort -rn \
> error_report.txtMisol 3: Tarmoq ulanishlarini sanash
netstat -an | grep ESTABLISHED | wc -lMisol 4: Process'larni tartiblash
ps aux --sort=-%mem | head -10
# eng ko'p RAM yegan 10 ta jarayon3.13. Tez-tez uchraydigan xatolar
Eslatib o'tamiz
>>>farqini chalkashtirmang.>— qayta yozadi,>>— qo'shib boradi.2>&1tartibi.command > out 2>&1— to'g'ri.command 2>&1 > out— xato.Pipe'da xatolik yashirinishi.
cat a.txt | grep foo'dacat'ning xatosistdoutga emas,stderrga ketadi. Pipe'ni siljitmaydi.sudova>birlashtirish.sudo teeishlatishni unutmang.
3.14. Mashqlar
ls -lanatijasinidirectory.txtga yozing va ekranda ham ko'rsating (teebilan)./etc/passwdfaylida nechta foydalanuvchi borligini bitta pipeline bilan toping.ps auxnatijasidagi eng ko'p CPU yegan 5 ta jarayonni topadigan pipeline yozing.dmesgnatijasini stderr bilan birgasystem.logga yozing.<<< "5+5"orqalibccalculator'iga oddiy hisob bering.
3.15. Xulosa
| Operator | Ma'nosi |
|---|---|
> | stdout'ni faylga (overwrite) |
>> | stdout'ni faylga (append) |
< | Fayldan stdin |
2> | stderr'ni faylga |
2>&1 | stderr → stdout |
&> | stdout + stderr birga |
| | Pipe (buyruqlar zanjiri) |
tee | Ekranga va faylga |
<< | Here document |
<<< | Here string |
Endi siz buyruqlarni xohlagancha bog'lay olasiz. Keyingi bobda matnlar bilan ishlash — cat, head, tail, grep, wc — buyruqlarini chuqurroq o'rganamiz.
Keyingi sahifa: 4. Matnlar bilan ishlash →