Ohne awk ?...Aber es ist so einfach mit awk:
echo 'maps.google.com' | awk -F. '{print $NF}'
AWK ist ein viel leistungsfähigeres Werkzeug, das man in der Tasche haben sollte. -F wenn für FeldtrennerNF die Anzahl der Felder ist (steht auch für den Index des letzten)
Sie könnten so etwas versuchen:
echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev
Erklärung
rev
kehrt "maps.google.com" zumoc.elgoog.spam
umcut
verwendet Punkt (dh '.') als Trennzeichen und wählt das erste Feld, dasmoc
ist- Zuletzt kehren wir es wieder um, um
com
zu erhalten
Es ist nicht möglich, nur cut
zu verwenden . Hier ist eine Möglichkeit, grep
zu verwenden :
grep -o '[^,]*$'
Ersetzen Sie das Komma für andere Trennzeichen.
Erklärung:
-o
(--only-matching
) gibt nur den Teil der Eingabe aus, der mit dem Muster übereinstimmt (standardmäßig wird die gesamte Zeile gedruckt, wenn sie eine Übereinstimmung enthält).[^,]
ist eine Zeichenklasse, die jedem anderen Zeichen als dem Komma entspricht.*
stimmt mit dem vorhergehenden Muster null oder öfter überein, also[^,]*
stimmt mit null oder mehr Nicht-Komma-Zeichen überein.$
entspricht dem Ende der Zeichenfolge.- Zusammengenommen entspricht das Muster null oder mehr Nicht-Komma-Zeichen am Ende der Zeichenfolge.
- Wenn es mehrere mögliche Übereinstimmungen gibt,
grep
bevorzugt diejenige, die am frühesten beginnt. Das gesamte letzte Feld wird also abgeglichen.
Vollständiges Beispiel:
Wenn wir eine Datei namens data.csv haben enthält
one,two,three
foo,bar
dann grep -o '[^,]*$' < data.csv
wird ausgegeben
three
bar
Verwenden Sie eine Parametererweiterung. Dies ist viel effizienter als jede Art von externem Befehl, cut
(oder grep
) enthalten.
data=foo,bar,baz,qux
last=${data##*,}
Siehe BashFAQ #100 für eine Einführung in die native String-Manipulation in Bash.