Befehlszeile: Teilzeichenfolge aus der Ausgabe extrahieren

25

Sagen wir, ich führe den Befehl SayStuff aus

$ SayStuff

und die Ausgabe ist

Watermelons and cucumbers

Jetzt. Angenommen, ich möchte den Teilstring cucumbersaus der Ausgabe extrahieren und in etwas umleiten.
Die Art und Weise, wie ich programmgesteuert vorgehen würde, wäre, die Ausgabe durch das Trennzeichen Space in ein Array aufzuteilen und darauf zu verweisen ArrayName[2]. Ich bin ziemlich neu in Shell-Skripten und habe nur halbkryptische cutBeispiele ausgegraben, von denen keines Sinn ergab.

Irgendwelche Ideen?

krystah
quelle

Antworten:

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

Das -d ' 'teilt cutauf Leerzeichen auf. -f 3wählt die dritte Spalte aus.

Sie können auch verwendet werden awk, welche die Aufspaltung auf weltraumgestützte tut schon und macht die verfügbaren Spalten $1, $2...

$ echo "Watermelons and cucumbers" | awk '{ print $3 }'
cucumbers
slhck
quelle
Beachten Sie, dass dabei cutkeine variable Anzahl von Leerzeichen verarbeitet wird awk.
Zitrax
13

Ich würde wahrscheinlich eine der Optionen verwenden, die bereits von @slhck angegeben wurden, aber hier sind einige weitere Möglichkeiten, dies zu tun:

  1. Verwenden von Arrays wie in jeder anderen Sprache:

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

    Der var=()deklariert ein Array, $(command)speichert die Ausgabe des Befehls. Also, foo=( $(SayStuff) )speichert die Ausgabe von SayStuffin das Array foound dann ist echoes das dritte Element mit ${foo[2]}.

  2. sed

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

    Der sedBefehl ersetzt ( s///) alles mit dem letzten Wort. Der reguläre Ausdruck passt auf alles bis zu einem Leerzeichen ( .*), das auf alles bis zum letzten Leerzeichen passt und dann das letzte Wort erfasst (\(.*\). Da das Wort gefangen genommen wurde, können wir es als bezeichnen \1.

    Eine einfachere Version:

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

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

    Diese Fähigkeiten String - Manipulation von Anwendungen bash finden Sie hier für weitere Details.

  4. Noch mehr Bash

    $ SayStuff | while read a b c; do echo $c; done
    cucumbers
  5. Perl, wo gibt es natürlich viele Möglichkeiten, dies zu tun:

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

    Die -aMarken perlverhalten sich wie awk: Zeilen werden mit Leerzeichen geteilt und im Array gespeichert @F. Wir drucken dann das letzte Element von @F( $#Fist die Anzahl der Elemente in @F). Das -lsagt Perl eine neue Zeile zu jeder hinzufügen printAussage, die , -ndass es STDIN Zeile für Zeile verarbeitet werden soll und -edass es das Skript auf der Kommandozeile angegeben ausgeführt werden soll.

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

    Die Optionen wurden oben erklärt, wir löschen nur alles bis zum letzten Leerzeichen und drucken ( -p).

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

    Hier übergeben wir Watermelons and cucumbersals Argumente, die Perl im @ARGArray speichert, und geben so das letzte Element von aus @ARG.

  6. Betrug. Dieser verwendet sed, um Leerzeichen in Zeilenumbrüche umzuwandeln und dann tailnur die letzte Zeile zu drucken.

    $ SayStuff | sed 's/ /\n/g' | tail -n 1
    cucumbers
  7. grep und reguläre Ausdrücke, -odie nur die übereinstimmende Zeichenfolge ausgeben.

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

    $ SayStuff | grep -o cucumbers
    cucumbers
terdon
quelle
2

Hier ist noch eine Erklärung:

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

Wenn Sie also das 3. Feld benötigen und es durch Leerzeichen '' begrenzt ist, ist es das

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

Wenn Sie das letzte Feld möchten, sollten Sie wahrscheinlich awk verwenden .
In diesem Fall wird es:

$ echo "Wassermelonen und Gurken" | awk '{print $ NF}'
Gurken

In awkNF bedeutet die Anzahl der Felder in der Zeile $NFdas letzte Feld in der Zeile.

Zeridon
quelle
im grunde ist die
selbe