GNU/Linux >> Znalost Linux >  >> Linux

Příkazový řádek:Extrahujte podřetězec z výstupu

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

-d ' ' říká cut rozdělit na prostory. -f 3 vybere třetí sloupec.

Můžete také použít awk , který již provádí rozdělení na základě prostoru a zpřístupňuje sloupce jako $1 , $2 , …

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

Pravděpodobně bych použil jednu z možností již poskytnutých @slhck, ale zde je několik dalších způsobů, jak to udělat:

  1. Použití polí jako v jakémkoli jiném jazyce:

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

    var=() deklaruje pole, $(command) uloží výstup příkazu. Takže foo=( $(SayStuff) ) ukládá výstup SayStuff do pole foo a vy pak echo je to třetí prvek s ${foo[2]} .

  2. sed

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

    sed příkaz nahradí (s/// ) vše s posledním slovem. Regulární výraz odpovídá čemukoli až do mezery (.* ), který bude odpovídat všemu až do poslední mezery a poté zachytí poslední slovo (\(.*\) . Protože slovo bylo zachyceno, můžeme jej označit jako \1 .

    Jednodušší verze:

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

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

    To využívá schopnosti manipulace se řetězci bash, další podrobnosti naleznete zde.

  4. Více bash

    $ SayStuff | while read a b c; do echo $c; done
    cucumbers
    
  5. Perl, kde samozřejmě existuje mnoho způsobů, jak to udělat:

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

    -a dělá perl chovat se jako awk , rozdělení řádků na prázdné místo a uložení do pole @F . Potom vytiskneme poslední prvek @F ($#F je počet prvků v @F ). -l řekne perlu, aby ke každému print přidal nový řádek -n že by měl zpracovat STDIN řádek po řádku a -e že by měl spustit skript uvedený na příkazovém řádku.

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

    Možnosti byly vysvětleny výše, pouze mažeme vše do posledního místa a tiskneme (-p ).

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

    Zde předáváme Watermelons and cucumbers jako argumenty, které perl uloží do @ARG pole a tak vytiskneme poslední prvek @ARG .

  6. podvod. Tento používá sed pro převod mezer na nové řádky a poté tail vytisknout pouze poslední řádek.

    $ SayStuff | sed 's/ /\n/g' | tail -n 1
    cucumbers
    
  7. grep a regulární výrazy pomocí -o který vytiskne pouze odpovídající řetězec.

    $ SayStuff | grep -Po '\w+$' 
    cucumbers
    
  8. podvádění

    $ SayStuff | grep -o cucumbers
    cucumbers
    

Zde je další vysvětlení:

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

Pokud tedy potřebujete 3. pole a je odděleno mezerami ' ', pak je

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

Pokud chcete POSLEDNÍ pravděpodobně byste měli použít awk .
V tomto případě to bude:

$ echo "Melouny a okurky" | awk '{ print $NF }'
okurky

V awk NF je počet polí v řádku, takže $NF znamená poslední pole v řádku.


Linux
  1. Jak zjistit, jakou verzi OS X používám z příkazového řádku?

  2. Spuštění linuxového příkazu z pythonu

  3. Připojte konec řádku k výstupu příkazu

  1. Prohledávejte torrenty z příkazového řádku v Linuxu

  2. Linux – Jak robustně přepnout výstupní zařízení Pulseaudio z příkazového řádku?

  3. Clonezilla z příkazového řádku

  1. Jak změnit zvukový výstup na hdmi z příkazového řádku?

  2. Najděte verzi WordPress z příkazového řádku

  3. Jak extrahovat dobu trvání z výstupu ffmpeg?