2016-10-21 3 views
0

ich eine Datei voller ähnlicher Informationen zum Abschnitt habe hier vorgestellt:Extrahieren von Informationen mit AWK und MUSTER

***Message size: 100000 *** best/avg/worst (MB/sec) 
     task pair: 0 - 1: 7423.55/6960.54/46.69 
     OVERALL AVERAGES:   7423.55/6960.54/46.69 
***Message size: 200000 *** best/avg/worst (MB/sec) 
     task pair: 0 - 1: 7423.55/6960.54/46.69 
     OVERALL AVERAGES:   7423.55/6960.54/46.69 

ich mit awk bestimmte Informationen extrahieren möge ein Message size bezogen, zum Beispiel, wenn ich extrahieren die avg Informationen aus der OVERALL AVERAGES Linie würde ich erhalten:

100000 6960.54 
200000 6960.54 

ich einfach alle Message sizes der Datei oder alle avg bekommen

awk '/size:/ { print $3}' filename 
awk '/size:/ {for(i=2; i<=2; i++) {getline; print $8}}' filename 

aber ich möchte einen Weg finden, alle diese Informationen zusammen in einer ähnlichen Spalte Mode zu erhalten.

Antwort

1

Sie können dies nutzen;

awk '/size:/ { printf $3};/OVERALL/ { print "\t" $5}' 

Beispiel;

[email protected] $ awk '/size:/ { printf $3};/OVERALL/ { print "\t" $5}' test 
100000 6960.54 
200000 6960.54 
+0

genial! Schön und einfach! – Manolete

1

Setzen Sie einfach die Größe der Nachricht in die Variable ms:

awk '/***Message size:/{ms=$3} ms && /OVERALL AVERAGES:/{print ms,$5; ms=""}' file 
1

mit etwas Hilfe von sed:

sed -n '/ size:/{N;s/.* size: *\([0-9]*\)[^\n]*\n/\1/p}' input_file | \ 
    awk '{print $1, $9}' 
1

Wenn Perl ist eine Option:

perl -ane 'if (/size:/){print $F[2]} elsif(/OVERALL/){print "\t$F[4]\n"}' text 

output:

100000 6960.54 
200000 6960.54 

Diese Befehlszeilenoptionen verwendet:

  • -n Schleife um jede Zeile des Eingabedatei
  • -a Autosplit-Modus - Split-Eingangsleitungen in die @F Array
  • -e die perl Code ausführen

@F ist das Array von Wörtern in jeder Zeile, indizierte $F[0]
$F[2] mit beginnt, ist das dritte Element in @F
$F[4] ist das fünfte Element in @F

Verwandte Themen