524 Stimmen

Wie man das letzte Feld mit 'cut' findet

Ohne Verwendung von sed oder awk, nur cut, wie bekomme ich das letzte Feld, wenn die Anzahl der Felder unbekannt oder bei jeder Zeile variiert?

1129voto

zedfoxus Punkte 34431

Sie könnten etwas Ähnliches versuchen:

echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev

Erklärung

  • rev kehrt "maps.google.com" um und wird zu moc.elgoog.spam
  • cut verwendet Punkt (d.h. '.') als Trennzeichen und wählt das erste Feld aus, das moc ist
  • schließlich kehren wir es wieder um, um com zu erhalten

184voto

Charles Duffy Punkte 255246

Verwenden Sie eine Parametererweiterung. Dies ist viel effizienter als jede Art von externem Befehl, cut (oder grep) inklusive.

data=foo,bar,baz,qux
last=${data##*,}

Sehen Sie sich BashFAQ #100 für eine Einführung in die native Zeichenkettenmanipulation in Bash an.

150voto

tom Punkte 20831

Es ist nicht möglich, nur cut zu verwenden. Hier ist eine Möglichkeit, grep zu verwenden:

grep -o '[^,]*$'

Ersetzen Sie das Komma durch 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 ausgegeben, wenn sie übereinstimmt).
  • [^,] ist eine Zeichenklasse, die jedes Zeichen außer einem Komma übereinstimmt.
  • * entspricht dem vorherigen Muster null oder mehrfach, also passt [^,]* null oder mehr Nicht-Komma-Zeichen an.
  • $ entspricht dem Ende des Strings.
  • Wenn es mehrere mögliche Übereinstimmungen gibt, bevorzugt grep die, die am frühesten beginnt. Daher wird das gesamte letzte Feld übereinstimmen.

Vollständiges Beispiel:

Wenn wir eine Datei namens data.csv mit folgendem Inhalt haben

one,two,three
foo,bar

dann wird grep -o '[^,]*$' < data.csv ausgeben

three
bar

109voto

Amir Mehler Punkte 3494

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 Sie dabei haben sollten. -F steht für das Feldtrennzeichen NF ist die Anzahl der Felder (steht auch für den Index des Letzten)

25voto

rjni Punkte 421

Es gibt mehrere Möglichkeiten. Du kannst das auch verwenden.

echo "Dein String hier"| tr ' ' '\n' | tail -n1
> hier

Offensichtlich sollte der Leerzeichen-Input für das tr-Kommando durch das von dir benötigte Trennzeichen ersetzt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X