2017-09-01 2 views
1

Ich muss "Tabellen" aus großen Protokolldateien extrahieren. Eine Tabelle wird durch eine Linie begrenzt, die enthält:Extrahieren Sie Linien zwischen zwei wiederholten Mustern

IMPRESSION DE LA TABLE TSTR 

und vom 4. Auftreten dieser Zeile:

--------- --------------------------------------------------------------- 

ich nicht eine genauere Definition meiner Tabelle finden.

Als Beispiel meine Protokolldatei enthält:

SOME 
TEXT 
BEFORE 
IMPRESSION DE LA TABLE TSTR     1323 
--------- --------------------------------------------------------------- 
POSITION |   INDICE     |   ARGUMENT 
--------- --------------------------------------------------------------- 
     | TYPE  | VALEUR    | TYPE  | VALEUR 
--------- --------------------------------------------------------------- 
    1 | CHAINE | COMPTEUR1    | ENTIER | 0 
    2 | CHAINE | COMPTEUR2    | ENTIER | 0 
    3 | CHAINE | RHO_1     | TABLE | 5187 
    4 | CHAINE | RHO_2     | TABLE | 6029 
--------- --------------------------------------------------------------- 
ANY 
OTHER 
TEXT 
FOLLOWS 

Und ich würde bekommen:

IMPRESSION DE LA TABLE TSTR     1323 
--------- --------------------------------------------------------------- 
POSITION |   INDICE     |   ARGUMENT 
--------- --------------------------------------------------------------- 
     | TYPE  | VALEUR    | TYPE  | VALEUR 
--------- --------------------------------------------------------------- 
    1 | CHAINE | COMPTEUR1    | ENTIER | 0 
    2 | CHAINE | COMPTEUR2    | ENTIER | 0 
    3 | CHAINE | RHO_1     | TABLE | 5187 
    4 | CHAINE | RHO_2     | TABLE | 6029 
--------- --------------------------------------------------------------- 

Ich fand Ideen an:

How to select lines between two patterns?

Extract lines between two patterns from a file

Aber keiner von ihnen ermöglicht das Finden des n-ten Vorkommens eines Musters.

Beachten Sie auch, dass ich andere Tabellen in meiner Datei (mit anderen Namen) habe, die ich nicht extrahieren möchte.

Antwort

2

Auf der Grundlage Ihrer Eingabe sollte dieses arbeiten:

awk '/^IMPRESSION DE LA TABLE TSTR/{ p = 1 };/^\-/{ c++; if (c == 4 ){ print $0; c = 0; p = 0} }p' 

Ausgang:

IMPRESSION DE LA TABLE TSTR     1323 
--------- --------------------------------------------------------------- 
POSITION |   INDICE     |   ARGUMENT 
--------- --------------------------------------------------------------- 
     | TYPE  | VALEUR    | TYPE  | VALEUR 
--------- --------------------------------------------------------------- 
    1 | CHAINE | COMPTEUR1    | ENTIER | 0 
    2 | CHAINE | COMPTEUR2    | ENTIER | 0 
    3 | CHAINE | RHO_1     | TABLE | 5187 
    4 | CHAINE | RHO_2     | TABLE | 6029 
--------- --------------------------------------------------------------- 

Erläuterung:

Dieser beginnt mit dem Drucken Wenn eine Zeile, die mit IMPRESSION DE LA beginnt sieht TABELLE TSTR. Dann zählt es die Zeilen beginnend mit einem - bis zum vierten Vorkommen. Wenn der vierte erreicht ist, wird die Zeile gedruckt und der Zähler wird wieder auf Null gesetzt. Auch p ist auf 0 gesetzt und so ist das Drucken bis zur nächsten Zeile, die mit IMPRESSION DE LA TABLE TSTR beginnt, deaktiviert.

+0

großen Werke haben, falls ich keinen anderen Tisch vor . Aber das Muster "------" wird mehrere Male gefunden, bevor die gewünschte Tabelle erreicht wird, also scheint es, dass der Zähler dann nutzlos ist. – Simpom

+0

OK gelöst: Ich setze c = 0, wenn "IMPRESSION ..." gefunden wird. – Simpom

+0

Am Anfang habe ich vergessen, c auf 0 zu setzen. Aber jetzt sollte es mit mehreren funktionieren. Ich habe es versucht, indem ich deine vier Mal in eine Datei kopiert habe. – JFS31

0

Perl zur Rettung:

perl -ne ' 
    ($table, $line) = (1, 0) if /IMPRESSION DE LA TABLE TSTR/; 
    ++$line if /^-{9} -{63}$/; 
    print if $table; 
    ($table, $line) =() if 4 == $line; 
' -- file 
3

Short awk Ansatz:

awk '/^IMPRESSION DE LA TABLE TSTR/{f=1}f && /^-/ && ++c==4{print; f=c=0}f' file 

Der Ausgang:

IMPRESSION DE LA TABLE TSTR     1323 
--------- --------------------------------------------------------------- 
POSITION |   INDICE     |   ARGUMENT 
--------- --------------------------------------------------------------- 
     | TYPE  | VALEUR    | TYPE  | VALEUR 
--------- --------------------------------------------------------------- 
    1 | CHAINE | COMPTEUR1    | ENTIER | 0 
    2 | CHAINE | COMPTEUR2    | ENTIER | 0 
    3 | CHAINE | RHO_1     | TABLE | 5187 
    4 | CHAINE | RHO_2     | TABLE | 6029 
--------- --------------------------------------------------------------- 
Verwandte Themen