it-swarm.com.de

Wie verwende ich cut, um durch mehrere Leerzeichen zu trennen?

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 dazwischen zusätzliche Leerzeichen stehen.

31
rubo77

Wenn wir den Befehl tr zusammen mit der Option Squeeze (-s flag), um alle mehreren aufeinanderfolgenden Leerzeichen in ein einzelnes Leerzeichen umzuwandeln und dann die Operation cut mit Leerzeichen als Trennzeichen auszuführen - wir können auf die erforderliche Spalte zugreifen, die die Zahlen enthält.

Siehe den unten abgebildeten Code:

cat file | tr -s ' ' | cut -d ' ' -f 8

34
Wald Schilfrohr

Um Ihre Frage wörtlich zu beantworten:

sed 's/   */:/g' | cut -d : -f 5

oder

awk -F '  +' '{print $5}'

Dies reicht jedoch nicht aus, wenn die Zahl in Klammern 10 usw. erreicht. Wenn Sie nur an den Zahlen interessiert sind, können Sie alles andere entfernen.

sed 's/[^.0-9][^.0-9]*/:/g' | cut -d : -f 6

Diese Befehle drucken alle die letzte Spalte einer durch Leerzeichen getrennten Datei:

  • awk '{print $NF}' file

    in awk ist NF die Anzahl der Felder und $NF das letzte Feld.

  • Perl -lane 'print $F[$#F]' file

    -a Teilt die Datei auf Leerzeichen in das Array auf @F, $#F Ist die Anzahl der Elemente im Array, also ist $F[$#F] Das letzte Element. Das -n Bedeutet, die in der Befehlszeile angegebene Datei zu lesen und das mit -e Übergebene Skript auf jede Zeile anzuwenden. -l Fügt jeder print - Anweisung nur ein Zeilenumbruchzeichen (\n) Hinzu.

  • sed 's/.* //g'

    ein einfacher regulärer Ausdruck, der alles dem letzten Leerzeichen zuordnet und es löscht, wobei nur die letzte Spalte übrig bleibt.

  • rev file | cut -d' ' -f 1 | rev

    rev kehrt die Ausgabe um, sodass das letzte Feld das erste ist, cut mit Trennzeichen zum Drucken und rev, um den Text wieder auf den Normalwert umzukehren. Dies funktioniert nicht, wenn Sie aufeinanderfolgende Leerzeichen haben.

Aufgrund Ihrer Eingaben möchten Sie vermutlich nicht die letzte Spalte, sondern die vorletzte oder die beiden letzten Spalten. Verwenden Sie in diesem Fall diese, um die letzten 2 zu drucken (8.39 Mbits/sec):

awk '{print $(NF-1),$NF}' file 
Perl -lane 'print "$F[$#F-1] $F[$#F]"' file 
sed 's/.* \(.* .*\)/\1/' file 
rev file | cut -d' ' -f 1,2 | rev

und diese zum Drucken des vorletzten (8.39):

awk '{print $(NF-1)}' file 
Perl -lane 'print $F[$#F-1]' file 
sed 's/.* \(.*\) .*/\1/' file 
rev file | cut -d' ' -f 2 | rev
5
terdon

Sie können das mehrfache Auftreten von Leerzeichen nicht mit cut gemäß Handbuch trennen:

Ausgabefelder werden durch ein einzelnes Vorkommen des Feldtrennzeichens getrennt.

es sei denn, der Text wird um denselben Betrag getrennt oder Sie verwenden tr, um überschüssige Texte zu entfernen.

Verwenden Sie andernfalls alternative Tools wie awk, sed oder ex.

Zum Beispiel:

ex -s +'%norm $2Bd0' +%p +q! foo.txt

Ersetzen Sie +q! mit -cwq, um die Änderungen an Ort und Stelle zu speichern.

4
kenorb

Verwenden Sie einen Perl-Einzeiler wie folgt:

Perl -lane 'print $F[-2]' input_file

Erläuterung:

Option -e Bewirkt, dass der Perl-Interpreter das Skript inline und nicht in einer Datei sucht.

Option -n Bewirkt, dass die Eingabe (Datei oder STDIN aus einer Pipe) Zeile für Zeile gelesen wird.

Mit der Option -l Wird das Trennzeichen für Eingabedatensätze (standardmäßig OS-abhängig, unter UNIX standardmäßig neu) nach dem Lesen der Zeile entfernt und am Ende zu jedem print hinzugefügt

Option -a Bewirkt, dass jede Eingabezeile auf Leerzeichen in Array @F Aufgeteilt wird, und $F[-2] Ist das zweite Element, das vom Ende an zählt. Dies ist das gewünschte Feld. Sie können auch $F[$#F-1] Verwenden, wobei $#F Der letzte Index des Arrays @F Ist, der etwas weniger lesbar ist.

0
Timur Shtatland