Como usar caracteres restritos no egrep?

3

Estou tentando usar um regex no egrep no Centos 5.10, baseado no que eu fiz de esta questão em SO.

T12345 .{1,100}[\n\r].{1,100}2014.03.04

Eu posso combinar com sucesso o regex com o conteúdo do meu navegador, mas quando eu o tento em um egrep, nada é retornado, mesmo que haja várias correspondências no meu diretório.

Exemplo de regex de trabalho aqui

Aqui está o egrep como eu estou usando.

egrep -l "T12345 .{1,100}[\n\r].{1,100}2014.03.04" logfiles_*.txt

Tanto quanto eu posso dizer, eu não estou escapando dos caracteres restritos corretamente, mas nada que eu tentei parece funcionar. Como posso adaptar este regex para uso no egrep?

    
por blarg 10.03.2014 / 13:27

2 respostas

9

grep corresponde a linhas de entrada. Se você quiser combinar várias linhas, use outro utilitário. Por exemplo, use pcregrep :

pcregrep -M "T12345 .{1,100}[\n\r].{1,100}2014.03.04" filename

Isso produziria:

31/01/2014 11:15:40 |  Bla Bla Bla Bla T12345 Bla Bla Bla
31/01/2014 11:15:40 | Bla Bla Bla 2014/03/04 Bla Bla Bla

para sua opinião.

    
por 10.03.2014 / 13:35
0

Seu problema é que egrep e grep normalmente leem uma única linha e depois comparam com o regexp dado.

Para que suas soluções regexp funcionem, você precisa da opção -z para egrep.

-z, --null-data
Treat the input as a set of lines, each terminated by a zero byte (the ASCII NUL character) instead of a newline. Like the -Z or --null option, this option can be used with commands like sort -z to process arbitrary file names.

Então tente isto: egrep -l -z "T12345 .{1,100}\s+.{1,100}2014.03.04" logfiles_*.txt

    
por 10.03.2014 / 13:48