$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers
Il -d ' ' dice cut dividere sugli spazi. -f 3 seleziona la terza colonna.
Puoi anche usare awk , che esegue già la suddivisione in base allo spazio e rende disponibili le colonne come $1 , $2 , …
$ echo "Watermelons and cucumbers" | awk '{ print $3 }'
cucumbers
Probabilmente userei una delle opzioni già fornite da @slhck, ma qui ci sono altri modi per farlo:
-
Utilizzando gli array, come faresti in qualsiasi altro linguaggio:
$ foo=( $(SayStuff) ) $ echo ${foo[2]} cucumbersIl
var=()dichiara un array,$(command)salva l'output del comando. Quindi,foo=( $(SayStuff) )memorizza l'output diSayStuffnell'arrayfooe poiechoè il terzo elemento con${foo[2]}. -
sed$ SayStuff | sed 's/.* \(.*\)/\1/' cucumbersIl
sedcomando sostituirà (s///) tutto con l'ultima parola. L'espressione regolare corrisponde a qualsiasi cosa fino a uno spazio (.*) che corrisponderà a tutto fino all'ultimo spazio e quindi catturerà l'ultima parola(\(.*\). Poiché la parola è stata catturata, possiamo riferirci ad essa come\1.Una versione più semplice:
$ SayStuff | sed 's/.* //' cucumbers -
bash
$ foo=$(SayStuff); echo ${foo##* } cucumbersQuesto usa le capacità di manipolazione delle stringhe di bash, vedi qui per maggiori dettagli.
-
Ancora bash
$ SayStuff | while read a b c; do echo $c; done cucumbers -
Perl, dove ovviamente ci sono molti modi per farlo:
$ SayStuff | perl -lane 'print $F[$#F]' cucumberIl
-arendeperlcomportarsi comeawk, dividendo le righe negli spazi bianchi e salvandole nell'array@F. Quindi stampiamo l'ultimo elemento di@F($#Fè il numero di elementi in@F). Il-ldice a perl di aggiungere una nuova riga a ogniprintistruzione, il-nche dovrebbe elaborare STDIN riga per riga e-eche dovrebbe eseguire lo script fornito nella riga di comando.$ SayStuff | perl -pe 's/.* //' cucumberLe opzioni sono state spiegate sopra, stiamo solo cancellando tutto fino all'ultimo spazio e stampando (
-p).$ perl -le 'print $ARGV[$#ARGV]' $(SayStuff) cucumbersQui stiamo superando
Watermelons and cucumberscome argomenti, che perl salverà nel@ARGarray e quindi, stampiamo l'ultimo elemento di@ARG. -
inganno. Questo usa
sedper convertire gli spazi in newline e poitailper stampare solo l'ultima riga.$ SayStuff | sed 's/ /\n/g' | tail -n 1 cucumbers -
grep ed espressioni regolari, utilizzando
-oche stampa solo la stringa corrispondente.$ SayStuff | grep -Po '\w+$' cucumbers -
barare
$ SayStuff | grep -o cucumbers cucumbers
Ecco qualche altra spiegazione:
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
Quindi se hai bisogno del 3° campo ed è delimitato da spazi '' ' allora lo è
$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers
Se vuoi il ULTIMO probabilmente dovresti usare awk .
In questo caso diventa:
$ echo "Angurie e cetrioli" | awk '{ stampa $NF }'
cetrioli
In awk NF è il numero di campi nella riga, quindi $NF indica l'ultimo campo della riga.