2017-09-01 11 views
1

大きなログファイルから "テーブル"を抽出する必要があります。2つの繰り返しパターン間の行を抽出する

IMPRESSION DE LA TABLE TSTR 

と、このラインの第4回発生によって:

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

私は私のテーブルのより正確な定義を見つけることができませんが、テーブルが含まれている行で区切られています。一例として、

、私のログファイルが含まれています

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 

そして、私は取得したいと思います:

How to select lines between two patterns?

Extract lines between two patterns from a file

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 
--------- --------------------------------------------------------------- 

私はでアイデアを見つけました

しかし、どれもパターンのn番目の出現を見つけることはできません。

また、他のテーブルを他の名前でファイルに保存しているので、抽出したくないことに注意してください。

答えて

2

あなたの入力に基づいて、この1つは動作するはずです:

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

出力:

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 
--------- --------------------------------------------------------------- 

説明:ISはIMPRESSION DE LAで始まる行を見たとき

この1つは印刷を開始しますTABLE TSTR。次に、 - で始まる行を4番目のオカレンスまでカウントします。 4番目に達するとラインが印刷され、カウンタは再び0に設定されます。また、pは0に設定されているため、IMPRESSION DE LA TABLE TSTRで始まる次の行まで印刷が無効になります。救助へ

+0

は素晴らしい作品。しかし、パターン "------"は、目的のテーブルが手に入る前に複数回見つかるため、カウンターは役に立たないようです。 – Simpom

+0

OK解決済み:「IMPRESSION ...」が見つかったときにc = 0に設定しました。 – Simpom

+0

最初は、cを0に設定するのを忘れました。しかし、今は複数のもので動作するはずです。あなたのファイルを4回ファイルにコピーしてみました。 – JFS31

0

たPerl:

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

ショートawkのアプローチ:

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

出力:私は前に他のテーブルを持っていない場合には

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 
--------- --------------------------------------------------------------- 
関連する問題