$ 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]} cucumbers
Il
var=()
dichiara un array,$(command)
salva l'output del comando. Quindi,foo=( $(SayStuff) )
memorizza l'output diSayStuff
nell'arrayfoo
e poiecho
è il terzo elemento con${foo[2]}
. -
sed
$ SayStuff | sed 's/.* \(.*\)/\1/' cucumbers
Il
sed
comando 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##* } cucumbers
Questo 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]' cucumber
Il
-a
rendeperl
comportarsi 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-l
dice a perl di aggiungere una nuova riga a ogniprint
istruzione, il-n
che dovrebbe elaborare STDIN riga per riga e-e
che dovrebbe eseguire lo script fornito nella riga di comando.$ SayStuff | perl -pe 's/.* //' cucumber
Le opzioni sono state spiegate sopra, stiamo solo cancellando tutto fino all'ultimo spazio e stampando (
-p
).$ perl -le 'print $ARGV[$#ARGV]' $(SayStuff) cucumbers
Qui stiamo superando
Watermelons and cucumbers
come argomenti, che perl salverà nel@ARG
array e quindi, stampiamo l'ultimo elemento di@ARG
. -
inganno. Questo usa
sed
per convertire gli spazi in newline e poitail
per stampare solo l'ultima riga.$ SayStuff | sed 's/ /\n/g' | tail -n 1 cucumbers
-
grep ed espressioni regolari, utilizzando
-o
che 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.