Frage

Ich habe eine Log-Datei, die ich brauche von spezifischen Muster zu extrahieren. Ich brauche zu finden und sie dann in eine neue Datei zu verarbeiten. grep auf Linux würde in der Regel den Trick tun, aber der reguläre Ausdruck erstreckt sich über mehrere Zeilen, die ich grep versteht nicht tun.

Hier ist ein Beispiel aus meinem Log / Debug-Datei:


Da:
1.328   0.5045  

Db:
0.6415  0.1192  

Lambda:
0.4429  -0.35   
-0.0461 -0.02421    

seps:
0.714272

Ich suche nach /Lambda:\n([-\d\.]+)\s+([\-\d\.]+)\s+\n([\-\d\.]+)\s+([\-\d\.]+)/ ich dann ausgegeben werden sollen die Linien in eine neue Datei, die Lambda-Entfernung und die Zahlen auf der gleichen Linie so Ausgabe \1\s\2\s\3\s\4\n neu ordnen

Also ich habe eigentlich zwei Fragen:

  1. Gibt es eine einfache Dienstprogramm, dies zu erreichen, auf jedem System?
  2. Gibt es eine Möglichkeit, dies auf Windows speziell zu tun?

Ich hoffe es eine einfache Lösung für dieses Problem ist, die mir entgangen ist. Ich würde lieber in den Fenstern bleiben, aber wenn ich zu Linux gehen werde ich dies getan.

War es hilfreich?

Lösung 3

Danke für alle Antworten. Ich mag die Antworten, die Sie mir für die Perl und awk gab. Ich bin einer jener seltsamen Programmierer, die nicht Perl nicht kennt, so nahm ich den Rubin Weg. hier ist meine Lösung

x=ARGV[0]
f=File.new(ARGV[1])
g=File.new(ARGV[2],"w")
f.read.gsub(/#{x}:\s*(([\d\.\-]*\t*)+\n)+/ ){|entry|
    puts entry
    g.puts entry.gsub(/#{x}:\n/,'').gsub(/\s+/,"\t").strip
}

das ich als Dienstprogramm mit meinem Editor Notepad ++ durch NppExec verwenden kann, die nicht Redirect und Leitungen nicht unterstützt, soweit ich weiß. Dies ermöglicht es auch für mich eine der Ausgabe zu sammeln, die ich durch das Programm diagnostizieren müssen. Nochmals vielen Dank y'all.

Andere Tipps

Dies ist ein guter Kandidat für awk, perl und dergleichen Stateful Parsen (diese werden in Windows die CMD.EXE laufen, vorausgesetzt, Sie haben perl und / oder awk/sed in Ihrem PATH, sowie von natürlich auf Linux und anderen Unix-Varianten):

awk "/^Lambda/ { in_lambda=1 ; next } in_lambda && /^ *$/ { in_lambda=0 ; printf \"\n\" ; next } in_lambda { printf \"%s \", $0 }" input_file >output_file

oder

perl -ne "chomp; if (/^Lambda/) { $in_lambda = 1 } elsif ($in_lambda && /^ *$/) { $in_lambda=0 ; printf \"\n\" } elsif ($in_lambda) { printf \"%s \", $_ }" input_file >output_file


Sie können einen zweiten Durchlauf durchführen Leerzeichen zu normalisieren (und trimmen Leerzeichen am Ende der Linien), wenn nötig.

awk "/^Lambda/ { in_lambda=1 ; next } in_lambda && /^ *$/ { in_lambda=0 ; printf \"\n\" ; next } in_lambda { printf \"%s \", $0 }" input_file | sed -e "s: *: :g" -e "s: *$::" >output_file

oder

perl -ne "chomp; if (/^Lambda/) { $in_lambda = 1 } elsif ($in_lambda && /^ *$/) { $in_lambda=0 ; printf \"\n\" } elsif ($in_lambda) { printf \"%s \", $_ }" input_file | perl -ne "s/ +/ /g; s/ +$//g; print" >output_file

Sie könnten installieren Perl oder Python oder Ruby oder PHP und das Skript schreiben ziemlich leicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top