Senza awk?...Ma è così semplice con awk:
echo 'maps.google.com' | awk -F. '{print $NF}'
AWK è uno strumento molto più potente da avere in tasca.-F se per field separatorNF è il numero di campi (sta anche per l'indice dell'ultimo)
Potresti provare qualcosa del genere:
echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev
Spiegazione
rev
inverte "maps.google.com" inmoc.elgoog.spam
cut
usa il punto (cioè '.') come delimitatore e sceglie il primo campo, che èmoc
- infine, lo invertiamo di nuovo per ottenere
com
Non è possibile usare solo cut
. Ecco un modo per usare grep
:
grep -o '[^,]*$'
Sostituisci la virgola per altri delimitatori.
Spiegazione:
-o
(--only-matching
) emette solo la parte dell'input che corrisponde al modello (l'impostazione predefinita è stampare l'intera riga se contiene una corrispondenza).[^,]
è una classe di caratteri che corrisponde a qualsiasi carattere diverso da una virgola.*
corrisponde al modello precedente zero o più volte, quindi[^,]*
corrisponde a zero o più caratteri diversi dalla virgola.$
corrisponde alla fine della stringa.- Mettendo insieme questo, il modello corrisponde a zero o più caratteri non virgola alla fine della stringa.
- Quando ci sono più possibili corrispondenze,
grep
preferisce quello che inizia prima. Quindi verrà abbinato l'intero ultimo campo.
Esempio completo:
Se abbiamo un file chiamato data.csv contenente
one,two,three
foo,bar
poi grep -o '[^,]*$' < data.csv
produrrà
three
bar
Utilizzare un'espansione dei parametri. Questo è molto più efficiente di qualsiasi tipo di comando esterno, cut
(o grep
) incluso.
data=foo,bar,baz,qux
last=${data##*,}
Vedi BashFAQ #100 per un'introduzione alla manipolazione nativa delle stringhe in bash.