2017-04-08 4 views
0

Ich verwende ein Programm, das Server pingt und Ergebnisse zurückgibt. Die resultierenden Daten im Textformat sind das genaue Gegenteil von dem, was ich brauche, was eine CSV ist. Ich bin schrecklich mit Regex und das scheint mir, dass es sehr komplex wäre, diese Daten zu glätten.Daten mit Regex abflachen

Daten vor regex

1.2. 3. 4 | Min | Avg | Max |Std.Dev|Reliab%| 
    ----------------+-------+-------+-------+-------+-------+ 
    + Cached Name | 0.000 | 0.000 | 0.000 | 0.000 | 100.0 | 
    + Uncached Name | 0.040 | 0.100 | 0.250 | 0.065 | 100.0 | 
    + DotCom Lookup | 0.049 | 0.121 | 0.182 | 0.040 | 100.0 | 
    ---<-------->---+-------+-------+-------+-------+-------+ 
        sub.domain.com 
       Some Provider, LLC 

    5.6. 7. 8 | Min | Avg | Max |Std.Dev|Reliab%| 
    ----------------+-------+-------+-------+-------+-------+ 
    + Cached Name | 0.000 | 0.000 | 0.000 | 0.000 | 100.0 | 
    + Uncached Name | 0.040 | 0.100 | 0.250 | 0.065 | 100.0 | 
    + DotCom Lookup | 0.049 | 0.121 | 0.182 | 0.040 | 100.0 | 
    ---<-------->---+-------+-------+-------+-------+-------+ 
        bus.domain2.net 
       Some Other Provider, Inc 

Und so weiter

Hier ist, was ich versuche regex zu extrahieren mit/sed

Domain,Company,IP,Cached Name Min,Cached Name Max,Cached Name Avg,Cached Name Std.Dev,Cached Name Reliab%,IP,Uncached Name Min,Uncached Name Max,Uncached Name Avg,Uncached Name Std.Dev,Uncached Name Reliab%,IP,Cached Name Min,Cached Name Max,Cached Name Avg,Cached Name Std.Dev,Cached Name Reliab%,IP,DotCom Lookup Min,DotCom Lookup Max,DotCom Lookup Avg,DotCom Lookup Std.Dev,DotCom Lookup Reliab% 
sub.domain.com,Some Provider - LLC,1.2.3.4,0.000,0.000,0.000,0.000,100.0,0.040,0.250,0.100,0.065,100.0,0.049,0.182,0.121,0.040,100 
bus.domain2.net,Some Other Provider - Inc,5.6.7.8,0.000,0.000,0.000,0.000,100.0,0.040,0.250,0.100,0.065,100.0,0.040,0.250,0.100,0.065,100.0,0.049,0.182,0.121,0.040,100.0 

Ist das Use-Case zu komplex für regex/sed? Hat jemand eine Ahnung, wie ich das erreichen würde?

+0

Hängt davon ab, wie Sie „komplex“ definieren. Es ist sicherlich machbar, aber es wird zu einem langen Regex führen. – Vallentin

+1

[Machbar, ja. Sollte es getan werden? Ganz sicher nicht.] (Https://regex101.com/r/tdCtpR/1/) – Vallentin

Antwort

2

Die Verwendung von sed ist vielleicht nicht die beste Wahl, aber manchmal überschreiben die Umstände oder Wünsche diesen Gedanken.

So, hier ist eine sed Lösung:

sed -En "s/^\s*([[:digit:]]+\.)\s*([[:digit:]]+\.)\s*([[:digit:]]+\.)\s*([[:digit:]]+)\s*\|.*$/\1\2\3\4\,/;T;{N;N;N;N;s/\n[^|]+\|//g;s/ \| /,/g;s/ \|//;x;N;z;N;N;s/,/ -/g;G;s/\n\s*/,/g;s/^,//;p}" input.txt 
  • sucht die Zeile mit dem "1.2.3.4", IP;
    versuchen, die IP zu extrahieren, wenn die nächste Zeile
    s/^\s*([[:digit:]]+\.)\s*([[:digit:]]+\.)\s*([[:digit:]]+\.)\s*([[:digit:]]+)\s*\|.*$/\1\2\3\4\,/;T;
  • im Falle des Erfolgs T;{
  • erhalten nächsten paar Zeilen und löschen (oder ersetzen durch „“) eine Menge von nicht benötigten Sachen
    N;N;N;N;s/\n[^|]+\|//g;s/ \| /,/g;s/ \|//; nicht versuchen
  • Speicher, und Zeile eins folgenden in Halteraum ignorieren x;N;z;
  • neben Linien erhalten und sanieren „“ N;N;s/,/ -/g;
  • anhängen, was gespeichert ist halter Raum G;
  • einig Make-up zu bekommen "" (nur) an den richtigen Stellen s/\n\s*/,/g;s/^,//;
  • Druck und getan p}

Ausgang:

sub.domain.com,Some Provider - LLC,1.2.3.4, 0.000,0.000,0.000,0.000,100.0,0.040,0.100,0.250,0.065,100.0,0.049,0.121,0.182,0.040,100.0 
bus.domain2.net,Some Other Provider - Inc,5.6.7.8, 0.000,0.000,0.000,0.000,100.0,0.040,0.100,0.250,0.065,100.0,0.049,0.121,0.182,0.040,100.0 

Sehr ähnlich gewünschte Ausgabe, mit der Ausnahme einige "" nach der 1.2.3.4,.
Ist das ein Problem?

(Eigentlich habe ich Zweifel, dass die gewünschte Ausgabe der Probe Eingabe übereinstimmt, können Sie überprüfen?)