2017-09-01 49 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 
--------- --------------------------------------------------------------- 
相关问题