Mundarija (37)
- Bu darsda
- 1. Nega bu kerak?
- 2. Uchta standart oqim
- 2.1 Dastur qayerdan o'qiydi, qayerga yozadi?
- 2.2 Nega ikkita chiqish?
- 3. Natijani faylga yozish: > va >>
- 3.1 Mashq papkasi
- 3.2 > — faylga yozish (eskisini o'chirib)
- 3.3 >> — fayl oxiriga qo'shish
- 3.4 Istalgan buyruq natijasini saqlash
- 4. Xatolarni yo'naltirish: 2>, 2>&1, /dev/null
- 4.1 > xatolarni ushlamaydi
- 4.2 2> — faqat xatolarni faylga
- 4.3 2>&1 — ikkalasini bitta faylga
- 4.4 /dev/null — "qora tuynuk"
- 5. Pipe |: buyruqlarni ulash
- 5.1 G'oya
- 5.2 Mashq fayli
- 5.3 wc — sanash
- 5.4 sort — tartiblash
- 5.5 uniq — takrorlarni olib tashlash
- 5.6 Hammasini birga: eng mashhur taom
- 6. Yana ikki qulay vosita
- 6.1 < — fayldan stdin'ga
- 6.2 tee — ham faylga, ham davomiga
- 7. Ko'p uchraydigan xatolar
- 7.1 >> o'rniga > yozish
- 7.2 Faylni o'zi ichiga yo'naltirish
- 7.3 sort siz uniq
- 7.4 Pipe xatolarni uzatmaydi
- 7.5 PowerShell'dagi > boshqacha yozadi
- 8. Mashqlar
- 1-mashq (oson): Belgini tanlang
- 2-mashq (o'rta): Nechta xil?
- 3-mashq (qiyin): Hisobot
- 9. Real ishda
- Xulosa
Oqimlar, pipe va yo'naltirish: stdin, stdout, stderr
Qisqacha: Har bir terminal buyrug'i uchta "quvur" bilan ishlaydi: kirish (stdin), oddiy natija (stdout) va xatolar (stderr).
>natijani faylga yozadi (eskisini o'chirib),>>fayl oxiriga qo'shadi,2>esa faqat xatolarni ajratadi. Pipe|bir buyruq natijasini keyingisiga uzatadi:sort buyurtmalar.txt | uniq -c— takrorlarni sanaydi.
Bu darsda
- Har bir buyruqning uchta oqimi — stdin, stdout, stderr — nima ekanini tushuntira olasiz.
- Natijani faylga yozasiz (
>) va fayl oxiriga qo'shasiz (>>), farqini aniq bilasiz. - Xato xabarlarini alohida faylga yoki "hech qayerga" (
/dev/null) yo'naltirasiz. - Pipe (
|) bilan buyruqlarni zanjir qilib ulaysiz. wc,sort,uniq,headbilan matnli ma'lumotni sanaysiz va tartiblaysiz.
Oldin bilishingiz kerak: Fayl va papkalar bilan ishlash, Fayl va matn qidirish, Qator oxiri, inode va symlink (fayl deskriptori qismi).
1. Nega bu kerak?
Choyxona egasi sizdan so'radi: "Bugun qaysi taom eng ko'p buyurtma qilindi?" Buyurtmalar ro'yxati faylda, har qatorda bitta taom. Qatorlar esa yuzlab.
Terminalda buni hal qiladigan bitta "hamma ishni qiladigan" dastur yo'q. Lekin kichik vositalar bor: biri qatorlarni tartiblaydi, biri takrorlarni sanaydi, biri birinchi qatorni oladi. Ularni bir-biriga ulasangiz — javob tayyor:
sort buyurtmalar.txt | uniq -c | sort -rn | head -n 1 3 choyBu darsning oxirida shu qatorning har bir bo'lagini tushunasiz.
Bu Unix dunyosining eski tamoyili: "Har bir dastur bitta ishni yaxshi qilsin. Dasturlar esa bir-biriga ulana olsin." Ulash uchun esa avval oqim nima ekanini bilish kerak.
2. Uchta standart oqim
2.1 Dastur qayerdan o'qiydi, qayerga yozadi?
Qator oxiri va inode darsida fayl deskriptorlarini ko'rgan edik: 0, 1, 2 raqamlari har bir dasturda doim band. Endi ular nima uchun kerakligini ko'ramiz.
Oqim (stream) — dasturga ma'lumot kiradigan yoki undan chiqadigan kanal. Suv quvurini tasavvur qiling: bir uchidan suv kiradi, ikkinchi uchidan chiqadi. Suv o'rnida — matn.
Har bir dastur ishga tushganda operatsion tizim unga uchta tayyor quvur beradi:
| Raqam | Nomi | Nima oqadi | Odatda qayerga ulangan |
|---|---|---|---|
0 |
stdin (standart kirish) | Dasturga kiradigan ma'lumot | Klaviatura |
1 |
stdout (standart chiqish) | Oddiy natija | Terminal ekrani |
2 |
stderr (standart xato) | Xato xabarlari | Terminal ekrani |
"std" — "standard" so'zining qisqartmasi. "in" — kirish, "out" — chiqish, "err" — xato (error).
flowchart LR
K["Klaviatura"] -- "0: stdin" --> D["Dastur, masalan ls"]
D -- "1: stdout" --> E1["Ekran: natija"]
D -- "2: stderr" --> E2["Ekran: xatolar"]2.2 Nega ikkita chiqish?
Ekranda natija ham, xato ham bir xil ko'rinadi. Shuning uchun ular aslida ikki xil quvurdan kelayotganini sezmaysiz. Buni ko'rish uchun bitta buyruqqa ham bor, ham yo'q faylni beramiz:
ls xabar.txt yoq.txtls: cannot access 'yoq.txt': No such file or directory
xabar.txtEkranda ikki qator (buni 4-bo'limda o'zingiz sinab ko'rasiz). Lekin xabar.txt — stdout'dan, ls: cannot access... esa stderr'dan keldi. Ular aralashib ko'rinyapti, xolos.
Nega ajratilgan? Tasavvur qiling: natijani faylga saqlayapsiz. Agar xato xabarlari ham o'sha faylga tushsa, fayl "iflos" bo'ladi. Keyingi dastur uni o'qiganda ls: cannot access degan qatorni ham fayl nomi deb o'ylaydi. Ikki quvur bo'lgani uchun natijani faylga, xatoni esa ekranga yo'naltirish mumkin.
Tekshirib ko'ring:
grep "narx" yoq.jsyozdingiz va ekrandagrep: yoq.js: No such file or directorychiqdi. Bu qator qaysi oqimdan keldi?
Javob
stderr'dan (2-oqim). Bu — xato xabari: fayl topilmadi. Agar grep so'zni topganda, topilgan qatorlar stdout'ga (1-oqim) chiqqan bo'lardi.
3. Natijani faylga yozish: > va >>
3.1 Mashq papkasi
Yangi papka yarating va unga kiring:
mkdir -p oqim
cd oqim3.2 > — faylga yozish (eskisini o'chirib)
Qidiruv darsida > va >> ni "hozircha shunchaki nusxalang" degan edik. Endi ularni ochamiz.
Odatda echo matnni ekranga chiqaradi. > belgisi esa stdout quvurini ekrandan faylga buradi:
echo "Salom, Toshkent" > xabar.txt
cat xabar.txtSalom, ToshkentBirinchi qator ekranga hech narsa chiqarmadi — matn to'g'ridan-to'g'ri xabar.txt ga ketdi. Fayl yo'q edi — > uni o'zi yaratdi. cat bilan ichini ko'rdik.
Endi xuddi shu faylga boshqa matn yozamiz:
echo "Salom, Buxoro" > xabar.txt
cat xabar.txtSalom, Buxoro"Toshkent" qatori yo'qoldi. > faylni har safar noldan yozadi: avval ichini tozalaydi, keyin yangi matnni yozadi.
Diqqat:
>hech narsa so'ramaydi. Muhim fayl nomini adashtirib yozsangiz, uning ichi darhol o'chadi va savatga tushmaydi — xuddirmkabi.
3.3 >> — fayl oxiriga qo'shish
Eski matnni saqlab, yangisini oxiriga qo'shish uchun ikkita burchak — >>:
echo "Salom, Samarqand" >> xabar.txt
cat xabar.txtSalom, Buxoro
Salom, SamarqandEslab qolish usuli: bitta > — "o'rniga yoz", ikkita >> — "ustiga qo'sh". Kundalik daftarga har kuni yangi qator qo'shgandek.
3.4 Istalgan buyruq natijasini saqlash
> faqat echo bilan emas, stdout'ga yozadigan har qanday buyruq bilan ishlaydi:
ls > royxat.txt
cat royxat.txtroyxat.txt
xabar.txtQiziq: ro'yxatda royxat.txt ning o'zi ham bor. Sababi — shell > ni ko'rib, avval faylni yaratadi, keyin ls ni ishga tushiradi. ls papkaga qaraganda fayl allaqachon turgan edi.
Tekshirib ko'ring: Quyidagi uch buyruqdan keyin
kun.txtichida nima bo'ladi?bashecho "dushanba" > kun.txt echo "seshanba" >> kun.txt echo "chorshanba" > kun.txt
Javob
Faqat chorshanba. Birinchi ikki buyruqdan keyin faylda ikki qator bor edi. Uchinchi buyruq bitta > bilan yozildi — u faylni tozalab, faqat yangi matnni yozdi.
4. Xatolarni yo'naltirish: 2>, 2>&1, /dev/null
4.1 > xatolarni ushlamaydi
Yo'q faylni ls qilib, natijani faylga yozamiz:
ls yoq.txt > natija.txtls: cannot access 'yoq.txt': No such file or directoryXato baribir ekranga chiqdi, natija.txt esa bo'sh qoldi. Chunki > — aslida 1> ning qisqa shakli. U faqat 1-quvurni (stdout) buradi. Xato esa 2-quvurdan (stderr) kelyapti.
4.2 2> — faqat xatolarni faylga
Xatolarni burish uchun quvur raqamini aniq yozamiz — 2>:
ls yoq.txt 2> xatolar.txt
cat xatolar.txtls: cannot access 'yoq.txt': No such file or directoryEndi ekran toza, xato esa faylda. Ikkalasini birga ham ishlatish mumkin — natija bir faylga, xato boshqasiga:
ls xabar.txt yoq.txt > natija.txt 2> xatolar.txtnatija.txt da — xabar.txt, xatolar.txt da — xato xabari. Ekranga hech narsa chiqmaydi.
2> va > orasida bo'sh joy bo'lmaydi: 2 > deb yozsangiz, shell 2 ni oddiy argument deb o'ylaydi.
4.3 2>&1 — ikkalasini bitta faylga
Ba'zan hamma narsani bitta faylga yig'ish kerak — masalan, keyin o'qish uchun jurnal (log). Buning uchun:
ls xabar.txt yoq.txt > hammasi.txt 2>&1
cat hammasi.txtls: cannot access 'yoq.txt': No such file or directory
xabar.txt2>&1 ni bo'laklab o'qiymiz: "2 ni (stderr) — &1 ga (stdout qayerga ketayotgan bo'lsa, o'sha joyga) bur". & belgisi bu yerda "1 — fayl nomi emas, quvur raqami" degan ishora. & siz 2>1 deb yozsangiz, xatolar 1 degan faylga yoziladi.
Diqqat: Tartib muhim.
> hammasi.txt 2>&1— to'g'ri.2>&1 > hammasi.txt— xato ekranda qoladi. Shell yo'naltirishlarni chapdan o'ngga bajaradi: ikkinchi holatda stderr stdout'ga ulanganda, stdout hali ekranga qarab turgan edi. Bash'da qisqa shakl ham bor:&> hammasi.txt— ikkalasi bitta faylga.
4.4 /dev/null — "qora tuynuk"
Linux va macOS'da (Git Bash'da ham) /dev/null degan maxsus "fayl" bor. Unga yozilgan hamma narsa izsiz yo'qoladi. Kerak bo'lmagan xabarlarni jim qilish uchun ishlatiladi:
ls xabar.txt yoq.txt 2> /dev/nullxabar.txtXato xabari yo'qoldi, natija qoldi. Hamma narsani jim qilish uchun: buyruq > /dev/null 2>&1. Windows PowerShell'da uning o'rnida $null ishlatiladi: buyruq 2> $null.
Tekshirib ko'ring:
ls xabar.txt yoq.txt > /dev/nullyozilsa, ekranda nima qoladi?
Javob
Faqat xato xabari: ls: cannot access 'yoq.txt': .... > faqat stdout'ni (xabar.txt qatorini) /dev/null ga yubordi. stderr esa yo'naltirilmadi, shuning uchun ekranda qoldi.
5. Pipe |: buyruqlarni ulash
5.1 G'oya
Hozirgacha stdout'ni faylga burdik. Pipe esa uni boshqa buyruqqa buradi. Pipe (quvur) — tik chiziq | belgisi. U chapdagi buyruqning stdout'ini o'ngdagi buyruqning stdin'iga to'g'ridan-to'g'ri ulaydi. Oraliq fayl kerak emas.
Klaviaturada | odatda Enter tepasidagi \ tugmasida turadi — Shift bilan bosiladi.
Zavod konveyerini tasavvur qiling: birinchi ishchi detalni yasab, lentaga qo'yadi. Lenta uni ikkinchi ishchiga olib boradi, u bo'yaydi. Uchinchisi qadoqlaydi. Pipe — o'sha lenta.
5.2 Mashq fayli
Choyxonaning bugungi buyurtmalarini faylga yozamiz. printf — echo ga o'xshash buyruq, lekin \n ni yangi qatorga aylantiradi (qator oxiri darsidan eslang: \n — LF belgisi):
printf "choy\nosh\nsomsa\nchoy\nmanti\nosh\nchoy\n" > buyurtmalar.txt
cat buyurtmalar.txtchoy
osh
somsa
choy
manti
osh
choyYetti qator, yetti buyurtma.
5.3 wc — sanash
wc (word count — so'zlarni sanash) qator, so'z va baytlarni sanaydi. Bizga ko'pincha faqat qatorlar kerak — -l (lines):
wc -l buyurtmalar.txt7 buyurtmalar.txtEndi birinchi pipe. grep choy qatorlarini topadi, wc -l ularni sanaydi:
grep "choy" buyurtmalar.txt | wc -l3Nima bo'ldi, qadamma-qadam:
grep "choy" buyurtmalar.txtuchta qatorni topdi va ularni stdout'ga yozdi.|bu uch qatorni ekranga emas,wc -lning stdin'iga uzatdi.wc -lkirgan qatorlarni sanadi va3ni ekranga chiqardi.
E'tibor bering: wc ga fayl nomi bermadik. Fayl berilmasa, u stdin'dan o'qiydi — pipe aynan shunga ulangan.
Maslahat:
ls | wc -l— papkadagi fayllar sonini chiqaradi. Oddiy, lekin juda ko'p ishlatiladi.
5.4 sort — tartiblash
sort qatorlarni alifbo bo'yicha tartiblaydi:
sort buyurtmalar.txtchoy
choy
choy
manti
osh
osh
somsaFoydali flaglar: -r — teskari tartib (reverse), -n — sonlar bo'yicha (numeric). -n nega kerak? Oddiy sort sonlarni ham harf kabi solishtiradi:
printf "15000\n8000\n120000\n9000\n" > narxlar.txt
sort narxlar.txt120000
15000
8000
9000120000 birinchi — chunki u 1 bilan boshlanadi, 8000 esa 8 bilan. Lug'atda "a" "b" dan oldin kelgani kabi. sort -n esa sonlarni qiymati bo'yicha tartiblaydi:
sort -n narxlar.txt8000
9000
15000
1200005.5 uniq — takrorlarni olib tashlash
uniq (unique — yagona) bir xil qatorlardan bittasini qoldiradi. Lekin bitta shart bor. Tartiblanmagan faylga ishlatib ko'ring:
uniq buyurtmalar.txtchoy
osh
somsa
choy
manti
osh
choyHech narsa o'zgarmadi! uniq faqat yonma-yon turgan bir xil qatorlarni birlashtiradi. Bu faylda ikkita choy hech qayerda yonma-yon emas.
Shuning uchun avval sort — u bir xil qatorlarni yonma-yon qo'yadi. Keyin uniq:
sort buyurtmalar.txt | uniqchoy
manti
osh
somsaTo'rt xil taom. uniq -c (count — sanash) esa har biri necha marta uchraganini ham yozadi:
sort buyurtmalar.txt | uniq -c 3 choy
1 manti
2 osh
1 somsaRaqam oldidagi bo'sh joylar — uniq ning odatdagi ko'rinishi, xato emas.
5.6 Hammasini birga: eng mashhur taom
Endi 1-bo'limdagi savolga qaytamiz:
sort buyurtmalar.txt | uniq -c | sort -rn | head -n 1 3 choyTo'rt bosqichli konveyer:
flowchart LR
A["sort<br/>bir xillarni yonma-yon qo'yadi"] --> B["uniq -c<br/>sanaydi: 3 choy, 1 manti..."]
B --> C["sort -rn<br/>son bo'yicha, kattasi tepada"]
C --> D["head -n 1<br/>faqat birinchi qator"]head -n 1 ni fayllar bilan ishlash darsidan bilasiz — u birinchi qatorlarni oladi. U ham fayl berilmasa, stdin'dan o'qiydi.
Konveyerni bo'lakma-bo'lak quring. Avval sort buyurtmalar.txt ni ishga tushiring va natijaga qarang. Keyin | uniq -c qo'shing, yana qarang. Shunda har bosqich nima qilayotgani ko'rinib turadi va xato bo'lsa — qayerdaligini darhol bilasiz.
Tekshirib ko'ring:
sort buyurtmalar.txt | uniq | wc -lnima chiqaradi va bu qaysi savolga javob?
Javob
4. sort | uniq takrorlarsiz ro'yxat beradi (choy, manti, osh, somsa), wc -l esa uni sanaydi. Savol: "Bugun nechta xil taom buyurtma qilindi?"
6. Yana ikki qulay vosita
6.1 < — fayldan stdin'ga
> natijani faylga chiqaradi. Teskari yo'nalish ham bor: < faylni buyruqning stdin'iga beradi.
wc -l < buyurtmalar.txt7Farqqa qarang: wc -l buyurtmalar.txt — 7 buyurtmalar.txt chiqargan edi. Bu safar fayl nomi yo'q, chunki wc faylni o'zi ochmadi — u shunchaki stdin'dan qatorlar oldi va nomini bilmaydi. Faqat sonni olish kerak bo'lganda qulay.
6.2 tee — ham faylga, ham davomiga
Ba'zan natijani faylga saqlash va ekranda ko'rish (yoki keyingi buyruqqa uzatish) kerak bo'ladi. tee shu ishni qiladi. Nomi "T" harfidan — suv quvurining T shaklidagi ayrisi: oqim ikkiga bo'linadi.
sort buyurtmalar.txt | uniq -c | tee hisobot.txt 3 choy
1 manti
2 osh
1 somsaNatija ekranga chiqdi va bir vaqtda hisobot.txt ga ham yozildi. tee -a — faylni o'chirmasdan oxiriga qo'shadi (xuddi >> kabi).
tee konveyerning o'rtasida ham turishi mumkin. Unda u nusxani faylga yozadi, oqimni esa ekranga emas, keyingi buyruqqa uzatadi.
Tekshirib ko'ring:
sort -u buyurtmalar.txt | tee turlar.txt | wc -ldan keyin ekranda nima chiqadi,turlar.txtichida nima bo'ladi? (sort -u— tartiblab, takrorlarni olib tashlaydi.)
Javob
Ekranda faqat 4. turlar.txt ichida esa to'rt qator: choy, manti, osh, somsa. tee to'rt qatorni faylga yozdi va xuddi shu qatorlarni wc -l ga uzatdi. Ekranga faqat oxirgi buyruq — wc -l ning natijasi chiqdi.
7. Ko'p uchraydigan xatolar
7.1 >> o'rniga > yozish
echo "yangi buyurtma" > buyurtmalar.txt — va bir kunlik ro'yxat yo'qoldi, faylda bitta qator qoldi. Xato xabari ham chiqmaydi. Qoida: mavjud faylga qo'shayotgan bo'lsangiz — doim >>. Yozishdan oldin bir soniya to'xtab, belgilarni sanang.
7.2 Faylni o'zi ichiga yo'naltirish
Faylni tartiblab, o'shaning o'ziga saqlamoqchi bo'ldingiz:
sort buyurtmalar.txt > buyurtmalar.txtNatija — fayl butunlay bo'sh (0 qator). Xato chiqmaydi. Nega? royxat.txt misolidagi qoidani eslang: shell > ni ko'rib, sort ishga tushishidan oldin faylni tozalaydi. sort o'qishni boshlaganda fayl allaqachon bo'sh.
Tuzatish: boshqa faylga yozing, keyin nomini almashtiring:
sort buyurtmalar.txt > tartiblangan.txt
mv tartiblangan.txt buyurtmalar.txt7.3 sort siz uniq
uniq buyurtmalar.txt — takrorlar o'z joyida qoldi, buni yuqorida ko'rdik. uniq faqat yonma-yon qatorlarni ko'radi. Qoida: doim sort | uniq. Yoki qisqasi: sort -u buyurtmalar.txt — tartiblaydi va takrorlarni olib tashlaydi.
7.4 Pipe xatolarni uzatmaydi
ls yoq.txt | wc -lls: cannot access 'yoq.txt': No such file or directory
0wc 0 dedi, xato esa ekranga chiqdi. Chunki pipe ham > kabi faqat stdout'ni uzatadi. Xatoni ham uzatish kerak bo'lsa: ls yoq.txt 2>&1 | wc -l — bu safar 1.
7.5 PowerShell'dagi > boshqacha yozadi
Windows PowerShell 5.1 (Windows'da tayyor keladigan versiya) > bilan faylni UTF-16 kodlashda yozadi. Masalan, "Salom" > x.txt dan keyin fayl boshida FF FE baytlari paydo bo'ladi, har harfdan keyin esa 00 bayti turadi. Matn kodlash darsidan bilasizki, ko'p dasturlar UTF-8 kutadi. Bunday faylni ular "g'alati belgilar" bilan o'qiydi.
Tuzatish: bu darsdagi buyruqlarni Git Bash yoki WSL'da bajaring. PowerShell'da faylga yozish kerak bo'lsa, kodlashni aniq ko'rsating: "Salom" | Out-File x.txt -Encoding utf8. Batafsil — PowerShell darsida.
8. Mashqlar
Mashqlarni oqim papkasida bajaring.
1-mashq (oson): Belgini tanlang
Bo'sh joylarga >, >>, 2> yoki | dan birini qo'ying:
mehmonlar.txtgaAlini yozish (fayl yangi):echo "Ali"mehmonlar.txt- Shu faylga
Malikani qo'shish (Ali qolsin):echo "Malika"mehmonlar.txt - Mehmonlar sonini sanash:
cat mehmonlar.txtwc -l - Faqat xatoni faylga yozish:
ls yoq.txtxato.txt
Yechim
echo "Ali" > mehmonlar.txt
echo "Malika" >> mehmonlar.txt
cat mehmonlar.txt | wc -l
ls yoq.txt 2> xato.txt2Birinchisi faylni yaratadi, ikkinchisi oxiriga qo'shadi. Uchinchisida cat fayl matnini stdout'ga chiqaradi, pipe esa uni wc -l ga uzatadi — 2. (Qisqaroq yo'li ham bor: wc -l < mehmonlar.txt.) To'rtinchisida faqat 2-oqim faylga ketadi.
2-mashq (o'rta): Nechta xil?
Taksi haydovchisi Jasur kun davomida qayerga borganini yozib bordi:
printf "Chilonzor\nYunusobod\nChilonzor\n" > manzillar.txt
printf "Sergeli\nYunusobod\nChilonzor\n" >> manzillar.txtIkkinchi qatorda >> — birinchi uch manzil o'chib ketmasligi uchun.
Bitta konveyer bilan javob toping:
- Jami nechta safar bo'lgan?
- Nechta xil tumanga borgan?
- Har bir tumanga necha marta borgan?
Yechim
wc -l < manzillar.txt
sort manzillar.txt | uniq | wc -l
sort manzillar.txt | uniq -c6
3
3 Chilonzor
1 Sergeli
2 Yunusobod- Har qator — bitta safar,
wc -lsanaydi:6. sort | uniqtakrorsiz ro'yxat beradi,wc -luni sanaydi:3.uniq -char biriga son yozadi.sortsiz ishlatsangiz,Chilonzorbir necha marta alohida chiqib qolardi.
3-mashq (qiyin): Hisobot
Quyidagi natijani beradigan konveyer yozing. U bir vaqtda top.txt fayliga ham saqlansin:
3 Chilonzor
2 YunusobodYa'ni: eng ko'p borilgan ikkita tuman, kattasi tepada. Ishora: sort -rn — sonlar bo'yicha teskari, head -n 2 — birinchi ikki qator, tee — ham ekranga, ham faylga.
Yechim
sort manzillar.txt | uniq -c | sort -rn |
head -n 2 | tee top.txtBuyruq ikki qatorga bo'lindi — telefonda o'qish oson bo'lsin deb. Qator | bilan tugasa, bash buyruq davom etishini tushunadi va Enter'dan keyin ham kutadi. Terminalda bitta qatorda yozsangiz ham bo'ladi.
Bosqichlar:
sort— bir xil tumanlarni yonma-yon qo'yadi.uniq -c— sanaydi:3 Chilonzor,1 Sergeli,2 Yunusobod.sort -rn— qator boshidagi son bo'yicha, kattasi tepada.-nsiz ham bu yerda to'g'ri chiqardi, lekin10va9kabi sonlarda xato tartiblardi.head -n 2— faqat ikki qator.tee top.txt— natijani faylga yozadi va ekranga ham chiqaradi.
cat top.txt bilan faylni tekshiring — ichida ekrandagi ikki qator bo'ladi.
9. Real ishda
- Loglarni saqlash. Serverda dastur ishga tushganda uning barcha xabarlari faylga yig'iladi:
node server.js >> server.log 2>&1.node— JavaScript'ni ishga tushiradigan dastur, uni Node.js darsida o'rnatasiz. - Tahlil. "Bugun saytga qaysi sahifa eng ko'p ochildi?" — server jurnalidan
grep,sort,uniq -c,sort -rn,headkonveyeri bilan bir daqiqada javob. - Jim ishlaydigan skriptlar. Avtomatik skriptlarda keraksiz xabarlar
> /dev/nullbilan o'chiriladi — faqat xato bo'lsa ko'rinadi. - Boshqa dasturlarga uzatish. Keyingi darslarda ko'rasiz:
curlbilan internetdan olingan ma'lumot pipe orqali JSON'ni chiroyli ko'rsatadiganjqga uzatiladi. - Intervyu. "
>va>>farqi?", "2>&1nima qiladi?" — Linux bo'yicha klassik savollar.
Xulosa
- Har bir buyruqda uchta oqim bor: stdin (0, kirish), stdout (1, natija), stderr (2, xatolar).
>— faylga yozadi (eskisini o'chiradi),>>— oxiriga qo'shadi,<— fayldan stdin'ga beradi.2>— faqat xatolar;> fayl 2>&1— ikkalasi bitta faylga;/dev/null— keraksizini yo'q qilish.- Pipe
|chapdagi buyruq natijasini o'ngdagiga uzatadi; faqat stdout'ni, xatolarni emas. wc -lsanaydi,sort(-n,-r) tartiblaydi,uniq(-c) takrorlarni birlashtiradi — faqatsortdan keyin.- Faylni o'zining ichiga yo'naltirmang:
sort f > ffaylni bo'shatadi.
Keyingi dars: Exit code va buyruqlarni zanjirlash — buyruq muvaffaqiyatli tugadimi yoki xato bilan, buni qanday bilish va shunga qarab keyingi buyruqni ishga tushirish (&&, ||) ni o'rganamiz.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!