Gibt es eine Möglichkeit, den Befehl cut dazu zu bringen, nur das letzte Feld zu lesen?

10

Ich habe ein Leerzeichen getrennt Zeichenkette , die Ausgabe von einem Befehl, der ich mag Rohr cut, unter Verwendung von -fd ' 'auf Räume aufzuteilen. Ich weiß, dass ich die Feldnummer -f <n>anzeigen <n>kann, aber kann ich das letzte Feld anzeigen lassen, wenn ich die Länge der Zeichenfolge nicht kenne?

Oder muss ich ein flexibleres Textbearbeitungswerkzeug wie sedoder verwenden awk?

Arronisch
quelle
Ich denke, der Befehl cut kann ihn nicht unterstützen, ist sich aber nicht sicher. Hatten Sie einen Versuch mit cut -d '' -f-?
αғsнιη
3
Weitere Möglichkeiten: stackoverflow.com/questions/22727107/…
edwinksl
@KasiyA -nmacht es von Anfang an zum n, n-ist von n bis zum Ende und es gibt die --complementOption, die die Auswahl umkehrt. Aber keine Möglichkeit, die Anzahl der Felder zu zählen und darauf zu reagieren, soweit ich das beurteilen kann.
Arronical

Antworten:

12

Nein, das cutkann ich nicht. Sie können zwei revBefehle verwenden, wie z

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

aber es ist normalerweise einfacher zu bedienen awk:

echo 'foo bar baz' | awk '{print $(NF)}'
Florian Diesch
quelle
7

Sie können dies nur mit der Shell tun. Mit der Parametererweiterung wird kein externes Tool benötigt:

${var##* }

var##*verwirft alles vom Start bis zum letzten Leerzeichen vom Parameter (Variable) var.

Wenn das Trennzeichen ein Leerzeichen sein kann, z. B. Leerzeichen oder Tabulator, verwenden Sie die Zeichenklasse [:blank:]:

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

Beispiel:

$ var='foo bar spam egg'

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


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

$ echo "$var"
foo    bar    spam    egg

$ echo "${var##*[[:blank:]]}"
egg
heemayl
quelle
Ich hatte in einem Kommentar zur Antwort von Severus Tux über die Verwendung der Parametererweiterung gesprochen, aber die leere Zeichenklasse ist eine nützliche Information, danke.
Arronical
4

Ich persönlich mag Florian Dieschs Antwort. Aber es gibt auch diesen Weg.

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

Erläuterung:

wc -wgibt die Anzahl der Wörter an. und cutschneidet das letzte Wort

BEARBEITEN:

Ich habe mir einen anderen Weg ausgedacht:

echo "Any random string here" | tac -s' ' | head -1
Severus Tux
quelle
Richtig, aber dies ist wahr, wenn Delim Leerzeichen oder Tabulator ist und wenn Ihr Cut-Delim nicht dasselbe ist,
schlägt
Nettes Querdenken, aber wenn ich einstelle, a="my string here"könnte ich auch die Parametererweiterung von verwenden ${a##* }.
Arronical
1
Ja, aber der OP sagte, er habe eine durch Leerzeichen getrennte Zeichenfolge.
Severus Tux
2

Hier ist eine Verwendung grep

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

Wie es funktioniert:

  • grep with -oDruckt nur die übereinstimmenden (nicht leeren) Teile einer übereinstimmenden Zeile.
  • Der reguläre Ausdruck [^ ]*$stimmt mit allem vom Ende überein, bis er ein Leerzeichen gefunden hat.

Ein weiterer Liner von Glenn Jackman mit Perl

$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good
Souravc
quelle