2017-09-01 48 views
1

我需要從大型日誌文件中提取「表」。在兩個重複模式之間提取行

IMPRESSION DE LA TABLE TSTR 

,並通過這條線的第四發生:一個表由一個包含行分隔

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

我無法找到我的表的更精確的定義。

舉個例子,我的日誌文件中包含:

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 

而且我想獲得:

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

我發現的想法在:

How to select lines between two patterns?

Extract lines between two patterns from a file

但它們都不允許找到模式的第n次出現。

還請注意,我有我的文件(與其他名稱),我不想提取其他表。

回答

2

根據您的輸入這個應該工作:

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

說明:

就是看到與印象DE LA開頭的行時,這一個開始打印表TSTR。然後它將以直到第四次出現爲止的行數進行計數。當到達第四個時,打印該行並將計數器再次設置爲零。此外,p設置爲0,因此打印被禁用,直到以IMPRESSION DE LA TABLE TSTR開頭的下一行。

+0

的情況下,偉大的作品我之前沒有其它表。但是在所需表格到達之前多次發現模式「------」,所以看起來計數器是無用的。 – Simpom

+0

OK求解:當發現「IMPRESSION ...」時,我設置c = 0。 – Simpom

+0

一開始我忘了將c設置爲0.但現在它應該可以與多個工作。我嘗試了將你的文件複製到一個文件中四次。 – 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 
--------- --------------------------------------------------------------- 
相關問題