$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers
Der -d ' '
sagt cut
auf Leerzeichen aufteilen. -f 3
wählt die dritte Spalte aus.
Sie können auch awk
verwenden , der die Aufteilung bereits nach Leerzeichen durchführt und die Spalten als $1
verfügbar macht , $2
, …
$ echo "Watermelons and cucumbers" | awk '{ print $3 }'
cucumbers
Ich würde wahrscheinlich eine der bereits von @slhck gegebenen Optionen verwenden, aber hier sind ein paar weitere Möglichkeiten, dies zu tun:
-
Verwendung von Arrays, wie Sie es in jeder anderen Sprache tun würden:
$ foo=( $(SayStuff) ) $ echo ${foo[2]} cucumbers
Die
var=()
deklariert ein Array,$(command)
speichert die Ausgabe des Befehls. Alsofoo=( $(SayStuff) )
speichert die Ausgabe vonSayStuff
in das Arrayfoo
und Sie dannecho
es ist das dritte Element mit${foo[2]}
. -
sed
$ SayStuff | sed 's/.* \(.*\)/\1/' cucumbers
Die
sed
Befehl ersetzt (s///
) alles mit dem letzten Wort. Die Regex passt alles bis auf ein Leerzeichen (.*
), der alles bis zum letzten Leerzeichen abgleicht und dann das letzte Wort(\(.*\)
erfasst . Da das Wort erfasst wurde, können wir es als\1
bezeichnen .Eine einfachere Version:
$ SayStuff | sed 's/.* //' cucumbers
-
bash
$ foo=$(SayStuff); echo ${foo##* } cucumbers
Dies nutzt die String-Manipulationsfähigkeiten von Bash, siehe hier für weitere Details.
-
Mehr Bash
$ SayStuff | while read a b c; do echo $c; done cucumbers
-
Perl, wo es natürlich viele Möglichkeiten gibt, dies zu tun:
$ SayStuff | perl -lane 'print $F[$#F]' cucumber
Die
-a
machtperl
verhalten sich wieawk
, Zeilen an Leerzeichen aufteilen und in das Array@F
speichern . Wir drucken dann das letzte Element von@F
($#F
ist die Anzahl der Elemente in@F
). Die-l
weist Perl an, jedemprint
einen Zeilenumbruch hinzuzufügen -Anweisung, die-n
dass es STDIN zeilenweise verarbeiten soll und-e
dass es das auf der Kommandozeile angegebene Skript ausführen soll.$ SayStuff | perl -pe 's/.* //' cucumber
Die Optionen wurden oben erklärt, wir löschen einfach alles bis zum letzten Leerzeichen und drucken (
-p
).$ perl -le 'print $ARGV[$#ARGV]' $(SayStuff) cucumbers
Hier übergeben wir
Watermelons and cucumbers
als Argumente, die Perl im@ARG
speichert array und so drucken wir das letzte Element von@ARG
. -
Trickserei. Dieser verwendet
sed
um Leerzeichen in Zeilenumbrüche umzuwandeln und danntail
um nur die letzte Zeile zu drucken.$ SayStuff | sed 's/ /\n/g' | tail -n 1 cucumbers
-
grep und reguläre Ausdrücke mit
-o
die nur die passende Zeichenfolge ausgibt.$ SayStuff | grep -Po '\w+$' cucumbers
-
Betrug
$ SayStuff | grep -o cucumbers cucumbers
Hier ist eine weitere 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 ' ' getrennt ist, dann ist es
$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers
Wenn Sie das LETZTE wollen Feld sollten Sie wahrscheinlich awk verwenden .
In diesem Fall wird es:
$ echo "Wassermelonen und Gurken" | awk '{ drucke $NF }'
Gurken
In awk
NF ist die Anzahl der Felder in der Zeile, also $NF
bedeutet das letzte Feld in der Zeile.