Ich möchte die letzte Spalte dieses Beispiels erhalten:
[ 3] 1.0- 2.0 sec 1.00 MBytes 8.39 Mbits/sec
[ 3] 2.0- 3.0 sec 768 KBytes 6.29 Mbits/sec
[ 3] 3.0- 4.0 sec 512 KBytes 4.19 Mbits/sec
[ 3] 4.0- 5.0 sec 256 KBytes 2.10 Mbits/sec
...
Wenn ich benutze
cut -d\ -f 13
Ich bekomme
Mbits/sec
6.29
4.19
2.10
weil manchmal zusätzliche Leerzeichen dazwischen sind.
text-processing
columns
cut
rubo77
quelle
quelle
Mbits/sec
, ist es das, was Sie wollen oder die 2 letzten Spalten?Antworten:
Um Ihre Frage wörtlich zu beantworten:
oder
Das geht aber nicht, wenn die Zahl in Klammern 10 usw. erreicht. Wenn Sie nur an den Zahlen interessiert sind, können Sie alles andere entfernen.
quelle
| sed 's/ .*//'
am Ende der ersten beiden Beispiele hinzu. Natürlich gibt es noch viele andere Möglichkeiten.+
statt*
: Katzentest | sed 's / [^. 0-9] \ + /: / g' | cut -d: -f 6+
und?
in ERE an, lässt aber\+
und\?
in BRE undefiniert.Wenn wir den
tr
Befehl zusammen mit der Option squeeze (-s
Flag) verwenden, um alle mehreren aufeinander folgenden Leerzeichen in ein einzelnes Leerzeichen zu konvertieren und dann diecut
Operation mit Leerzeichen als Begrenzer auszuführen, können wir auf die erforderliche Spalte mit den Zahlen zugreifen.Beziehen Sie sich auf den unten abgebildeten Code:
cat file | tr -s ' ' | cut -d ' ' -f 8
quelle
Diese Befehle geben alle die letzte Spalte einer durch Leerzeichen getrennten Datei aus:
awk '{print $NF}' file
in
awk
,NF
ist die Anzahl der Felder und$NF
ist das letzte Feld.perl -lane 'print $F[$#F]' file
-a
Teilt die Datei auf Whitespace in das Array@F
,$#F
ist die Anzahl der Elemente im Array und$F[$#F]
ist das letzte Element. Das-n
Mittel liest die in der Befehlszeile angegebene Datei und wendet das mit-e
jeder Zeile übergebene Skript an .-l
Fügt einfach\n
jederprint
Anweisung ein Zeilenumbruchzeichen ( ) hinzu .sed 's/.* //g'
Ein einfacher regulärer Ausdruck, der alles mit dem letzten Leerzeichen vergleicht und es löscht, wobei nur die letzte Spalte übrig bleibt.
rev file | cut -d' ' -f 1 | rev
rev
Kehrt die Ausgabe um, so dass das letzte Feld das erste ist,cut
mit einem Begrenzungszeichen, um es zu drucken undrev
den Text auf den normalen Wert zurückzusetzen. Dies funktioniert nicht, wenn aufeinanderfolgende Leerzeichen verwendet werden .Aufgrund Ihrer Eingaben möchten Sie wahrscheinlich nicht die letzte Spalte, sondern die vorletzte oder die beiden letzten. In diesem Fall verwenden Sie diese, um die letzten 2 (
8.39 Mbits/sec
) zu drucken :und diese, um das vorletzte (
8.39
) zu drucken :quelle
Sie können das mehrfache Auftreten von Leerzeichen nicht anhand der folgenden Anweisungen trennen
cut
:es sei denn, der Text ist um den gleichen Betrag voneinander getrennt oder Sie
tr
entfernen überschüssigen Text .Verwenden Sie ansonsten alternative Tools wie
awk
,sed
oderex
.Beispielsweise:
Ersetzen Sie
+q!
durch-cwq
, um die Änderungen zu speichern.quelle
Verwenden Sie einen Perl-Einzeiler wie folgt:
perl -lane 'print $F[-2]' input_file
Erläuterung:
Option
-e
veranlasst den Perl-Interpreter, nach dem Skript inline und nicht in einer Datei zu suchen.Die Option
-n
bewirkt, dass die Eingabe (Datei oder STDIN aus einer Pipe) zeilenweise gelesen wird.Die Option entfernt
-l
das Trennzeichen für Eingabedatensätze (standardmäßig betriebssystemabhängig, Zeilenumbruch unter UNIX) nach dem Lesen der Zeile und fügt es am Ende zu jeder Zeile hinzuprint
Option
-a
bewirkt , dass jede Eingangsleitung aufgeteilt wird auf Leerzeichen in einem Array@F
, und$F[-2]
ist das zweite Element des Zählen von dem Ende, das ist das Feld gewünscht wird . Sie können auch verwenden$F[$#F-1]
, wo$#F
der letzte Index des Arrays ist@F
, der etwas weniger lesbar ist.quelle