Esiste un modo per fare in modo che il comando cut legga solo l'ultimo campo?


11

Ho una stringa separata dallo spazio che viene emessa da un comando, a cui mi piace eseguire il pipe cut, usando -fd ' 'per dividere gli spazi. So che posso usare -f <n>per visualizzare il numero del campo <n>, ma posso farlo visualizzare l'ultimo campo se non conosco la lunghezza della stringa?

O devo usare uno strumento di modifica del testo più flessibile come sedo awk?


Penso che il comando cut non possa supportare, ma non sono sicuro, hai provato con cut -d '' -f-?
αғsнιη,


@KasiyA lo -nrende n dall'inizio, n-da n alla fine e c'è l' --complementopzione che inverte la selezione. Ma non c'è modo di contare il numero di campi e agire su di esso per quanto ne so.
Arronical

Risposte:


12

No, cutnon posso farlo. Potresti usare due revcomandi, come

echo 'foo bar baz' | rev | cut -d' ' -f1 | rev

ma di solito è più facile da usare awk:

echo 'foo bar baz' | awk '{print $(NF)}'

7

Puoi farlo usando solo la shell, non è necessario alcuno strumento esterno, usando Parameter Expansion:

${var##* }

var##*eliminerà tutto dall'avvio all'ultimo spazio dal parametro (variabile) var.

Se il delimitatore può essere qualsiasi spazio bianco, ad esempio spazio o scheda, utilizzare la classe di caratteri [:blank:]:

${var##*[[:blank:]]}

Esempio:

$ var='foo bar spam egg'

$ echo "${var##* }"
egg


$ var=$'foo\tbar\tspam\tegg'

$ echo "$var"
foo    bar    spam    egg

$ echo "${var##*[[:blank:]]}"
egg

Avevo parlato dell'utilizzo dell'espansione dei parametri in un commento sulla risposta di Severus Tux, ma la classe di caratteri vuota è un'informazione utile, grazie.
Arronical

4

Personalmente mi piace la risposta di Florian Diesch. Ma c'è anche così.

a=$(echo "your string here" | wc -w)
echo "your string here" | cut -d' ' -f$a

Spiegazione:

wc -wdà il numero di parole. e cuttaglia l'ultima parola

MODIFICARE:

Ho pensato a un altro modo di farlo:

echo "Any random string here" | tac -s' ' | head -1

Corretto, ma questo è vero quando è delim spazio o tab, e se il vostro delim taglio non è lo stesso, questo fallirà
αғsнιη

Bel pensiero laterale, anche se se sto impostando a="my string here"potrei usare anche l'espansione dei parametri ${a##* }.
Arronical

1
Sì, ma l'OP ha detto che aveva una stringa separata da spazio.
Severus Tux,

2

Eccone uno che usa grep

$ echo "Change is Good" | grep -o '[^ ]*$'
Good

Come funziona:

  • grep con -oStampa solo le parti corrispondenti (non vuote) di una linea corrispondente.
  • La regexp [^ ]*$corrisponde a qualsiasi cosa dall'estremità fino a quando non trova uno spazio.

Un'altra fodera di glenn jackman che usa il perl

$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.