Dies ist einfach, kurz und leicht zu schreiben, zu verstehen und zu überprüfen, und ich persönlich mag es:
grep -oE '\S+$' file
grep
Wenn in Ubuntu mit -E
oder aufgerufen wird -P
, bedeutet die Kurzschreibweise \s
ein Leerzeichen (in der Praxis normalerweise ein Leerzeichen oder ein Tabulator) und \S
etwas anderes. Mit dem Quantor+
und den End-of-Line - Anker$
, das Muster für \S+$
ein oder mehr Nicht-Leerzeichen am Ende einer Zeile . Sie können -P
anstelle von verwenden -E
; Die Bedeutung ist in diesem Fall gleich, es wird jedoch eine andere reguläre Ausdrucks-Engine verwendet, sodass sie möglicherweise unterschiedliche Leistungsmerkmale aufweisen .
Dies entspricht der kommentierten Lösung von Avinash Raj (nur mit einer einfacheren, kompakteren Syntax):
grep -o '[^[:space:]]\+$' file
Diese Ansätze funktionieren nicht, wenn hinter der Zahl ein Leerzeichen stehen könnte . Sie können geändert werden, aber ich sehe keinen Grund, hier darauf einzugehen. Obwohl es manchmal lehrreich ist, eine Lösung zu verallgemeinern, um in mehreren Fällen zu arbeiten, ist es nicht praktisch, dies fast so oft zu tun, wie die Leute annehmen, weil man normalerweise nicht weiß, auf welche von vielen verschiedenen inkompatiblen Arten das Problem letztendlich benötigt wird verallgemeinert werden.
Leistung ist manchmal ein wichtiger Gesichtspunkt. Diese Frage besagt nicht, dass die Eingabe sehr umfangreich ist, und es ist wahrscheinlich, dass jede hier veröffentlichte Methode schnell genug ist. Für den Fall, dass Geschwindigkeit gewünscht wird, finden Sie hier einen kleinen Benchmark für eine 10-Millionen-Zeilen-Eingabedatei:
$ perl -e 'print((<>) x 2000000)' file > bigfile
$ du -sh bigfile
439M bigfile
$ wc -l bigfile
10000000 bigfile
$ TIMEFORMAT=%R
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
819.565
$ time grep -oE '\S+$' bigfile > bigfile.out
816.910
$ time grep -oP '\S+$' bigfile > bigfile.out
67.465
$ time cut -d= -f2 bigfile > bigfile.out
3.902
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
815.183
$ time grep -oE '\S+$' bigfile > bigfile.out
824.546
$ time grep -oP '\S+$' bigfile > bigfile.out
68.692
$ time cut -d= -f2 bigfile > bigfile.out
4.135
Ich habe es zweimal ausgeführt, für den Fall, dass die Reihenfolge wichtig ist (wie es manchmal für E / A-schwere Aufgaben der Fall ist), und weil ich keine Maschine zur Verfügung hatte, die keine anderen Aufgaben im Hintergrund ausführte, die die Ergebnisse verzerren könnten. Aus diesen Ergebnissen schließe ich zumindest vorläufig und für Eingabedateien der von mir verwendeten Größe Folgendes:
Beeindruckend! Passing -P
(zu Verwendung PCRE ) statt -G
(die Standardeinstellung , wenn kein Dialekt angegeben wird) oder -E
aus grep
schneller um mehr als eine Größenordnung. Für große Dateien ist es möglicherweise besser, diesen Befehl zu verwenden als den oben gezeigten:
grep -oP '\S+$' file
BEEINDRUCKEND!! Das cut
Verfahren in αғsнιη Antwort , ist über eine Größenordnung schneller als auch die schnellere Version meiner Art und Weise! Es war auch der Gewinner im Benchmark von pa4080 , der mehr Methoden als diese, aber mit geringerem Input abdeckte - und aus diesem Grund habe ich es von allen anderen Methoden ausgewählt, um es in meinen Test aufzunehmen. Wenn Leistung wichtig ist oder Dateien sehr groß sind, sollte meiner Meinung nach die Methode von αιsнιη verwendet werden.cut -d= -f2 file
cut
Dies dient auch als Erinnerung daran, dass die einfachen cut
und paste
Hilfsprogramme nicht vergessen werden sollten und gegebenenfalls bevorzugt werden sollten, obwohl es komplexere Tools wie grep
diese gibt, die häufig als First-Line-Lösungen angeboten werden (und an die ich persönlich gewöhnter bin) verwenden).
grep -o '[^[:space:]]\+$' file