Ich möchte die letzte Spalte aus Zeilen extrahieren, die wie folgt aussehen:
880.952 NAV_Y uSimMarine -146.17516
Die Zahl ist nicht immer negativ und hat keine feste Länge (d. h. sie hat nicht immer die gleiche Anzahl von Dezimalstellen).
So komme ich fast ans Ziel:
grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"
Außer dass es auch mit der Zahl in der ersten Spalte übereinstimmt.
Wenn ich dies ändere, um das Zeilenende einzuschließen und die Übereinstimmungen in der ersten Spalte auszuschließen:
grep -E "[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"
Ich bekomme keine Übereinstimmungen, was ich nicht verstehe.
Was übersehe ich hier?
Antwort1
Verankern Sie den Ausdruck am Ende der Zeile:
grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"
Wenn Sie die PCRE-Option hinzufügen, um -o
nur die erfasste Gruppe zurückzugeben, werden Sie sehen, dass Ihr Beispiel übereinstimmt und die gewünschte Übereinstimmung zurückgibt:
grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$)"
-146.17516
Um Übereinstimmungen mit Zeilen in einer Datei mit optionalen, nachstehenden Leerzeichen zu finden, fügen Sie einfach \s*
Folgendes hinzu:
grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}\s*$)"
Antwort2
Vor dem ersten regulären Ausdruck muss ein Leerzeichen stehen:
grep -E "\s+-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"
sollte funktionieren, da es die Übereinstimmung am Zeilenanfang ausschließt.
Falls Sie es wollenNurdie vierte Spalte, können Sie leicht erreichen, dass entweder mit GNU sed:
sed -r 's/^\S+\s+\S+\s+\S+\s+(\S+)(\s.*|)$/\1/'
wobei \s
ein beliebiges Leerzeichen (Leerzeichen, Tabulator und die verschiedenen „Feeds“ 1 ) und \S
ein Nicht-Leerzeichen ist, oder (auf viel sauberere Weise) mit sed | cut
:
sed 's/\s\+/\t/g' | cut -f4
Dadurch werden zunächst alle Leerzeichen in einem Tab komprimiert und dann cut
die vierte Spalte ausgeschnitten. Außerdem können Sie problemlos weitere Spalten auswählen, z. B. mit cut -f1,4
und so weiter.
1) Das heißt: Form Feed, Line Feed und Carriage Return, wobei der mittlere in der Regel sed
als Zeilentrenner interpretiert wird.