Birlikte borulama komutlarına iyi bir örnek nedir?


33

Birisinin komut satırında boru kavramını öğrenmesine yardım ediyor olsaydınız ne örnek kullanırdınız? Gerçekte ortaya çıkan örnek aşağıdaki gibidir:

cat whatever.txt | less

Bunun en iyi örnek olmadığını hissediyorum, çünkü sadece bir adım var. Bunun faydası iyi, fakat temel olan |nedir?

İdeal olarak sunacağım örnek, bağımsız olarak çalıştırılabilecek ve daha sonra birlikte yayınlanmış olarak gösterilen çıktıları olan programları kullanacaktır.


3
Örneğiniz gerçekten o kadar iyi değil - temelde işe yaramaz kedi ödülü için bir aday.
maxschlepzig

@ maxschlepzig Size göre yanlış değiliz, ama siz de pek yardımcı değilsiniz; Bunun catiçin less whatever.txtgayet iyi işler için buna ihtiyacınız yok .
Bora M. Alper,

Yanıtlar:


34

Gerçek yaşam senaryosuna dayanarak, size biraz karmaşık bir örnek vereceğim.

Sorun

Diyelim ki komut conkymasaüstüme cevap vermeyi kesti ve ben de onu manuel olarak öldürmek istiyorum. Biraz Unix biliyorum, bu yüzden yapmam gereken şeyin komutu yerine getirmek olduğunu biliyorum kill <PID>. PID'yi almak için Unix dağıtımımın bana verdiği aracı psveya topveya herhangi bir aracı kullanabilirim . Fakat bunu bir komutla nasıl yapabilirim?

Cevap

$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill

YASAL UYARI: Bu komut yalnızca belirli durumlarda çalışır. Terminalinize kopyalamayın / yapıştırmayın ve kullanmaya başlayın, işlemleri şüphesizce öldürebilir. Aksine nasıl inşa edileceğini öğrenmek .

Nasıl çalışır

1- ps aux

Bu komut çalışan işlemlerin listesini ve bunlarla ilgili bazı bilgileri gösterir. İlginç bilgi, her bir işlemin PID'sini 2. sütununda göstermesidir. İşte kutumdaki komutun çıktısından bir alıntı:

$ ps aux
 rahmu     1925  0.0  0.1 129328  6112 ?        S    11:55   0:06 tint2
 rahmu     1931  0.0  0.3 154992 12108 ?        S    11:55   0:00 volumeicon
 rahmu     1933  0.1  0.2 134716  9460 ?        S    11:55   0:24 parcellite
 rahmu     1940  0.0  0.0  30416  3008 ?        S    11:55   0:10 xcompmgr -cC -t-5 -l-5 -r4.2 -o.55 -D6
 rahmu     1941  0.0  0.2 160336  8928 ?        Ss   11:55   0:00 xfce4-power-manager
 rahmu     1943  0.0  0.0  32792  1964 ?        S    11:55   0:00 /usr/lib/xfconf/xfconfd
 rahmu     1945  0.0  0.0  17584  1292 ?        S    11:55   0:00 /usr/lib/gamin/gam_server
 rahmu     1946  0.0  0.5 203016 19552 ?        S    11:55   0:00 python /usr/bin/system-config-printer-applet
 rahmu     1947  0.0  0.3 171840 12872 ?        S    11:55   0:00 nm-applet --sm-disable
 rahmu     1948  0.2  0.0 276000  3564 ?        Sl   11:55   0:38 conky -q

2- grep conky

Sadece bir süreçle ilgileniyorum, grepprogramıma uygun girişi bulmak için kullanıyorum conky.

$ ps aux | grep conky
 rahmu     1948  0.2  0.0 276000  3564 ?        Sl   11:55   0:39 conky -q
 rahmu     3233  0.0  0.0   7592   840 pts/1    S+   16:55   0:00 grep conky

3- grep -v grep

2. adımda görebileceğiniz gibi, komut psverir grep conkylistesine (sonuçta çalışan bir süreç) süreci. Filtrelemek için koşabilirim grep -v grep. Seçenek , deseni içerenler dışındaki tüm satırlarla eşleşmesini -vsöyler .grep

$ ps aux | grep conky | grep -v grep
 rahmu     1948  0.2  0.0 276000  3564 ?        Sl   11:55   0:39 conky -q

Not: 2. ve 3. adımları tek bir greparamada yapmanın bir yolunu bilmek isterim .

4- awk '{print $2}'

Şimdi hedef süreçlerimi izole ettim. PID’ini almak istiyorum. Başka bir deyişle, çıktının 2. sözcüğünü almak istiyorum. Şanslıyım ki, çoğu (hepsi?) Modern birimler, tabulardaki verilerle harikalar yaratan bir yazı awkdili sunmaktadır. Görevimiz kadar kolay hale geliyor print $2.

$ ps aux | grep conky | grep -v grep | awk '{print $2}'
 1948

5- xargs kill

PID’im var. Tek ihtiyacım olana geçmek kill. Bunu yapmak için kullanacağım xargs.

xargs killGirdiden okuyacağız (bizim durumumuzda borudan), aşağıdakilerden oluşan bir komut oluşturacak kill <items>( <items>girişten ne olursa olsun) ve sonra oluşturulan komutu çalıştıracaktır. Bizim durumumuzda bu yürütecek kill 1948. Görev tamamlandı.

Son sözler

Hangi unix sürümünü kullandığınıza bağlı olarak, bazı programların biraz daha farklı davranabileceğini unutmayın (örneğin, psPID'yi $ 3 sütununda verebilir). Bir şeyler yanlış veya farklı görünüyorsa satıcınızın belgelerini (veya daha iyi, mansayfaları) okuyun. Uzun borular tehlikeli olabileceğinden de dikkatli olun. Özellikle killveya gibi komutları kullanırken hiçbir varsayımda bulunmayın rm. Örneğin, 'conky' (veya 'Aconkyous') adında başka bir kullanıcı varsa, komutum tüm çalışan işlemlerini de öldürebilir!

Söylediklerime dikkat et, özellikle uzun borular için. Burada yaptığımız gibi etkileşimli olarak inşa etmek her zaman daha iyidir, varsayımlarda bulunmak ve daha sonra üzülmek.


Not: 2. ve 3. adımları tek bir grep çağrısında yapmanın bir yolunu bilmek isterim. -> grep "conky -q" :)
Wolfy

3
Aslında bu, yapabileceğiniz gibi kötü bir örnektirkill $(pgrep conky)
Patrick,

5
Bunun geç olduğunu biliyorum, ama daha da basitleştirebilirsinpkill conky
strugee

2
"" "Not: 2. ve 3. adımları tek bir adım adımda yapmanın bir yolunu bilmek isterim." "" "Aux" yerine "pid, comm" yerine - bu da POSIX olduğundan daha taşınabilir -Uysal. Bu şekilde, grep süreci sadece "grep conky" yerine "grep" olarak görünecektir, böylece kendi kendine eşleşmeyecektir.
Random832

2
Not: 2. ve 3. adımları tek bir greparamada yapmanın bir yolunu bilmek isterim . grep [c]onkyaradığın şey bu.
AlexT

15

Benim favorim bu:

youtube-dl $1 -q -o - | ffmpeg -i - $2

verilen youtube url'sinden bir video indirir $1ve tarafından verilen dosyayı çıkarır $2. Dosyanın sessizce nasıl -qSTDOUT'a gönderildiğini -o -, ffmpeg'a aktarıldığını ve buraya girdi olarak kullanıldığını not edin -i -.

Özellikle linux yenileri için bu, komut satırının neden kullanışlı olabileceği ve GUI araçlarını kullanmaktan daha kolay hale gelmesinin pratik bir örneği olabilir. Youtube'dan bir video indirmek ve sesini bir mp3'e dönüştürmek ne kadar sürecek emin değilim. Yukarıdaki satır bunu birkaç saniye içinde yapabilir.


3
youtube-dl sadece ses kaydetme seçeneğine sahiptir. Her zamanki komut URL'ler stdin burası giriş şöyledir: youtube-dl --extract-audio --audio-format mp3 -a -. Yine de güzel bir örnek, ancak bunu yapmanın daha kolay yolları var. (Dahili olarak ffmpeg olarak adlandırılır.)
Brigand

3
@FakeRainBrigand: Haha, bilmek güzel! Ancak, içine yerleştirilmemesi gereken bir alternatifim var: youtube-dl $1 -q -o - | mplayer -videoyu doğrudan mplayer'da oynatıyor. Dizüstü bilgisayarımdaki bu komutu sunucuma (TV’ye bağlı olan) video oynatmasını söylemek için kullanıyorum. Ben eklemek zorunda -display :0.0 -geometry 400x300+1200+200mplayer penceresi doğru ekranda görünür izin.
Baarn,

9

Genel kullanım (okuma: çoğu zaman kullanma yöntemim), bazı sebeplerden dolayı, farklı işlem görevlerini yerine getirmek için birkaç araç üzerinden bazı verileri çalıştırmak zorunda olduğum zamandır.

Bu yüzden derdim boruların kullanılması birlikte birçok yapı taşları (farklı UNIX araçları) monte tutkal gibidir. Gibi Ulrich dedi ve ortak bir dörtlük olduğunu.sortuniq

İzleyiciye bağlı olarak, bu boru kullanımını vurgulamak istiyorsanız, örneğin: "hey, bu ders kitabının kağıt ve ders notlarıyla birlikte birçok ilginç PDF'ye bağlantısı vardır, ancak bazıları tekrarlanır. her nasılsa bunu otomatikleştirmek? "

Sonra nasıl gösterebilirim lynx --dump --listonlynasıl bağlantıların listesini alır grepbiten bağlantılar için filtre olabilir .pdf, nasıl colrmya da sedsayıların temizleyecektir lynxnasıl her URL, soldan yazar sortve uniqnihayet nasıl kopyaların kurtulmak ve alabilir wget -i -almak için kullanılabilir dosyalar ( --waittabii ki sunucuda nazik olmak için).

Korkarım bu karmaşık bir örnek. Öte yandan, boruları yeni bağladığınızda ve kabuğun bir kerede çalıştırmasını sağladığınızda boruların gücünü göstermeye yardımcı olabilir.


2
GNU coreutilssort -u içinde de kullanabilirsiniz .
Teresa e Junior,

2

Tam olarak iyi grepolanı bilmiyorum, ama boru tesisatının en yaygın kullanım alanlarından biri olması gerekiyor wc -l. (Evet, grepaz bilinen bir -canahtarı var.)

Başka bir yaygın stanza, | sort | uniqyalnızca uniqgirişinin sıralanmasını gerektirdiği için olabilir.


Çoğu insan ... | sort -umümkünse tercih eder!

2

Bu örnek için ihtiyacınız olan değil, ama:

$ ps aux | grep -v grep | grep conky

... greps sırasını tersine çevirerek renklendirme korur, ancak çok daha az verimlidir. Muhtemelen büyük listelerde, renk önemli olmaz.

Ayrıca, bu web sayfası şunları önermektedir:

https://stackoverflow.com/questions/9375711/more-elegant-ps-aux-grep-v-grep

> Johnsyweb saat 21: 12'de 10: 31'te cevap verdi
> Her zamanki numara şudur:
> ps aux | grep '[t] erminal'
> Bu, '[t] erminal' öğesinin geçmeyeceği uçbirim içeren çizgilerle eşleşecektir!
> Ayrıca Unix'in pek çok tadı üzerinde de çalışır.

... ancak tek bir harf arıyorsanız ('X' süreci gibi), bu işe yaramayacaktır.


2

Sonunda bir buçuk yıl önce yaptığım oneliner'ın karmaşasını paylaşmaya başladım ...

while read in; do host "$in"; done < sites.txt | grep -iv "GOOGLE" | grep -E '1\.2\.3\.4|5\.6\.7\.8' | sed -e 's/has\ address\ 216.70.91.72//' | sed -e 's/has\ address\ 94.23.33.92//' | while read sites; do curl -sL -w "%{http_code} %{url_effective}\\n" "$sites" -o /dev/null; done | grep -ivE '4.*|5.*' | sed -e 's/200//' | sed -e 's/HTTP/http/'

O...

  1. Sites.txt okur
  2. Her birinde "host" çalıştırıyor (gece görüşünde dig + short bunu bir ton kolaylaştırabilirdi)
  3. "GOOGLE" içeren satırları kaldırır - bunlar mx kayıtlarıdır
  4. İki IP’den birine sahip olan çizgileri alır.
  5. Http durum kodunu listedeki her siteden alır.
  6. 4xx veya 5xx döndüren siteleri kaldırır
  7. Onu geri döndüren sitelerden "200" i çıkardı
  8. "HTTP" yi "http" ile değiştirir - tamamen estetik, gerçek bir sebep yok.

Eminim bu tek bir Python senaryosuyla daha iyi yapılabilirdi, iddiaya girerim.


Ah ... Bunun bir
acemiye

2
Sorum şu, amacı nedir?
ADTC

Alan adlarıyla dolu bir dosyam vardı ve iki sunucumdan birinde (maalesef "miras") bulunup bulunmadığını görmem gerekiyordu. Bu dosyayı okur, "host" yapar ve bu çıktıyı temizler, sonra 4xx veya 5xx hatası veriyor mu diye bir istek yapar. Eğer öyleyse, o zaman etki alanı atmak; eğer değilse, onları çıktı ve başka bir dosyaya koydum.
tanner

1

Bu benim için ilk akla gelen şeydi ...

mysqldumpstdout'a veri, şema ve isteğe bağlı prosedürleri ve fonksiyonları gönderen bir konsol uygulamasıdır. Genellikle yedekleme için bir dosyaya yönlendirilir.

mysqldump <options> > mydb.dump

Bu size sıkıştırılmamış bir sql betiği verirdi. Yer kazanmak için bzip2 ile sıkıştırabilirsiniz.

bzip2 mydb.dump

Alternatif olarak, ikisini de bir adımda yapabilirsiniz:

mysqldump <options> | bzip2 > mydb.dump.bz2

Yukarıdaki bu örnekte, stdout, bzip2'ye gönderilir mysqldump, bunun ardından çıkışı bir dosyaya yönlendirilir.


1
Çok ters çalışmasını ekleyin: bzcat mydb.dump.bz2 | mysql <options>.
Manatwork

1

İşte tek komutta birden fazla boru işimde kullandığım bir örnek. Bu, MySQL genel sorgu günlüğünü ($ OFILE) aramak ve reddedilen girişleri bulmak için gawk kullanır. Daha sonra bu adı ada göre sıralar, bu sayıları listeleyen uniq'e göre sıralar ve sayılan listeyi sayısal olarak sıralamak için son bir kez sıralarlar.

gawk '{ for (x=1;x<=NF;x++) if ( $x~"Access" && $(x+4)~".*@.*") print $(x+4)}' $OFILE | sort | uniq -c | sort -n

1

Borular, filtreler ve çevirmenlerle en iyi şekilde çalışır

find /usr/bin/ |                #produce 
sed 's:.*/::'  |                #translate: strip directory part
grep -i '^z'   |                #filter   : select items starting with z
xargs -d '\n' aFinalConsumer    #consume  

Bu şekilde, veriler bir programdan diğerine arabelleğe alınabilir ve hiçbir noktada tüm veriler aynı anda bellekte olmak zorunda değildir.


0

cat filename | less boruları kullanabildiğiniz için korkunç bir kullanımdır. less filename

İşte her gün kullandığım tırtıllara bir örnek (ancak bunun da kötü bir örneği olabilir): ls -la | more -c

Scott Hoffman ve Njsg cevapları daha iyi örneklerdir.



0

Bunu, klasör boyutu için sıralama analizine tabi tutmak istediğiniz herhangi bir dizinde yürütünüz (daha sonra END tuşuyla aşağı kaydırın):

du -m| sort -n| less

Sortiert nach Ordnergrösse


0

İşte xauth bir seçenek olmadığı zaman DISPLAY değişkenini ayarlamak için kullandığım bir örnek ...

export DISPLAY=\`who am i |awk '{print $NF}' | sed 's/[()]//g'`":0.0"

İlk komut gerekli verileri, yani ana bilgisayar adını veya IP'yi alır. İkinci komut sadece bu veriyi alır (son alan). Son olarak, son komut parantezi veriden çıkarır.


0

İlk boru çıktısının bir sonrakine girdi olarak verilebileceğini düşündüğünüz her yerde kullanabileceğiniz komut boruları

Örnekler.

  1. Metin dosyaları ile, belirli metin satırlarını bulmak için metin dosyasını grep'e geçirebilirsiniz. Ardından hattın belirli bir bölümünü değiştirmek veya yazdırmak için çıktıyı sed veya awk olarak geçirebilirsiniz.

kedi örneği txt | grep {some_line} | awk {some_command}

  1. İşlemle çalışmak, işlemi öldürmek için komutlar göndermek için boruları kullanabilirsiniz.

Bu basitçe, koştuğunuz komutun çıktısını hissederseniz, başka bir komutun girişi olabilir, bunları yönlendirebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.