Komut satırı: Alt dizeyi çıktıdan çıkart


26

SayStuff komutunu çalıştırdığımı söyle

$ SayStuff

ve çıktı

Watermelons and cucumbers

Şimdi. Alt dizeyi cucumbersçıktıdan çıkarmak ve bir şeye borulamak istiyorum .
Bu programsal olarak giderdim yolu sınırlayıcı Space tarafından bir diziye bölmek ve tarafından başvuru olacaktır ArrayName[2]. Komut dosyalarında oldukça yeniyim ve sadece yarı şifreli cutörnekleri kazmayı başardım , hiçbiri mantıklı değil.

Herhangi bir fikir?

Yanıtlar:


31
$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers

Mekanlar üzerinde bölünmeyi -d ' 'söyler cut. -f 3üçüncü sütunu seçer.

Ayrıca awk, zaten boşluk dayalı bölme yapar ve sütunları $1,, kullanılabilir yapar, kullanabilirsiniz $2...

$ echo "Watermelons and cucumbers" | awk '{ print $3 }'
cucumbers

Not cutederken, boşluk değişken sayıda işlemez olur awkyapmak.
Zitrax

14

Muhtemelen @slhck tarafından verilen seçeneklerden birini kullanacaktım ama işte bunu yapmanın birkaç yolu daha:

  1. Dizileri, diğer dillerde yaptığınız gibi kullanma:

    $ foo=( $(SayStuff) ) 
    $ echo ${foo[2]}
    cucumbers

    var=()Bir dizi beyan $(command)komutunun çıktısını kaydeder. Böylece, foo=( $(SayStuff) )çıkışını SayStuffdiziye fookaydeder ve sonra echoüçüncü elementtir ${foo[2]}.

  2. sed

    $ SayStuff | sed 's/.* \(.*\)/\1/'
    cucumbers

    sedKomutu (ikame edecektir s///geçen kelime ile) her şeyi. Normal .*ifade, son boşluğa kadar her şeyi eşleştirecek ve ardından son kelimeyi yakalayacak bir boşlukla ( ) eşleşir (\(.*\). Kelime ele geçirildiği için, onu olarak ifade edebiliriz \1.

    Daha basit bir sürüm:

    $ SayStuff | sed 's/.* //'
    cucumbers
  3. darbe

    $ foo=$(SayStuff); echo ${foo##* } 
    cucumbers

    Bu, bash'ın dize düzenleme yeteneklerini kullanır, daha fazla ayrıntı için buraya bakın.

  4. Daha Fazla Bash

    $ SayStuff | while read a b c; do echo $c; done
    cucumbers
  5. Perl, elbette, bunu yapmanın birçok yolu var:

    $ SayStuff | perl -lane 'print $F[$#F]'
    cucumber

    -aMarkaları perlgibi davranmaya awkboşluktan bölme çizgileri ve diziye tasarruf @F. Daha sonra öğesinin son öğesini yazdırırız @F( $#Fiçindeki öğelerin sayısıdır @F). -lPerl her bir yeni satır eklemek söyler print, deyimi -nbu çizgi ile STDIN hattını işlemek gerektiğini ve -ebunun komut satırına verilen komut dosyasını çalıştırmak gerektiğini söyledi.

    $ SayStuff | perl -pe 's/.* //'
    cucumber

    Seçenekler yukarıda açıklandı, sadece son boşluğa kadar her şeyi silip yazdırıyoruz ( -p).

    $ perl -le 'print $ARGV[$#ARGV]' $(SayStuff)
    cucumbers

    Burada Watermelons and cucumbersperl @ARGdizide kaydedilecek argümanlar olarak geçiyoruz ve böylece, son öğesini yazdırıyoruz @ARG.

  6. kandırmaca. Bu, sedboşlukları yeni satırlara dönüştürmek ve sonra tailyalnızca son satırı yazdırmak için kullanır .

    $ SayStuff | sed 's/ /\n/g' | tail -n 1
    cucumbers
  7. grep ve normal ifadeleri kullanarak -oyalnızca eşleşen dizeyi yazdırır.

    $ SayStuff | grep -Po '\w+$' 
    cucumbers
  8. hile

    $ SayStuff | grep -o cucumbers
    cucumbers

2

İşte biraz daha açıklama:

Usage: cut OPTION... [FILE]...

Print selected parts of lines from each FILE to standard output.

   -d, --delimiter=DELIM
          use DELIM instead of TAB for field delimiter

   -f, --fields=LIST
          select only these fields;  also print any line that contains  no
          delimiter character, unless the -s option is specified

Eğer 3. alana ihtiyacınız varsa ve boşluklarla sınırlanmışsa ''

$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3  
cucumbers

İsterseniz SON alanını muhtemelen kullanmalıdır awk .
Bu durumda olur:

$ echo "Karpuz ve salatalık" | awk '{print $ NF}'
salatalık

In awkNF satırındaki alan sayısı böylece $NFdoğrultusunda son alanını ifade eder.


temel olarak aynı soru burada ama daha genelleştirilmiş: stackoverflow.com/questions/3162385/… Evet başka yollar da kullanabilirsiniz ama awk en kısa
zeridon
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.