Mostra linhas combinadas para um dado regex no Linux

-1

Eu uso essa notação em meus arquivos de log:

[algo-algo]

algumas coisas são caracteres e números necessários e variáveis. Meu arquivo de log especial inclui uma linha com caracteres explicados acima. Ou seja,

Line 1: DEBUG [AS-kmksdf] Error occured!
Line 2: something somethingg..

Eu quero obter a Linha 1. Meus arquivos de log crescem dinamicamente e eu mostro na minha tela com:

tail -f log.txt

Como posso mostrar apenas essas linhas especiais?

Eu sei que vou usar grep e meu regex será sth. como

[[A-Z]*-[A-Z]*]

como combiná-los com esse comando. Isso não funciona:

tail -f log.txt | grep [[A-Z]*-[A-Z]*]

Eu uso o cygwin com o windows7 e posso executar alguns comandos do linux no meu cmd.exe.

    
por kamaci 20.06.2012 / 13:18

2 respostas

2

Existem alguns problemas com sua expressão regular:

  • Antes de mais nada, aconselho você a usar sempre a opção -P , que ativa expressões regulares compatíveis com Perl .

    Por padrão, grep usa Expressão regular básica , que não são amplamente usadas e sofrem de espaçamento inconsistente.

  • Como é [A-Z] , os colchetes têm um significado especial nas expressões regulares. Para usar um colchete literal nos PCREs, escape com uma barra invertida: \[ ou \]

  • As expressões regulares diferenciam maiúsculas de minúsculas, a menos que você defina a opção -i .

  • * significa qualquer número de ocorrências, incluindo ( 0 ). Você pode querer usar + (qualquer número de ocorrências positivo).

  • Sempre contorne sua expressão regular com aspas duplas ou o bash expandirá os caracteres.

Como resultado, o seguinte comando funcionará:

tail -f log.txt | grep -Pi "\[[A-Z]+-[A-Z]+\]"
    
por 20.06.2012 / 13:33
1
tail -f log.txt |grep -E '\[[a-zA-Z]*-[a-zA-Z]*\]'

Você pode usar o Regexpal para testar suas expressões regex. Além disso, você deve usar -E on grep . Não é obrigatório, e não é necessário neste caso, mas permite que você use expressões regex estendidas.

    
por 20.06.2012 / 13:23