“grep: Erro incomparável [” ao usar o regex

5

Estou tentando encontrar um padrão semelhante a este:

tail -n 100000 gateway.log | grep -B10 -A10 'Nov 22 11:13:56 Received Packet from [10.50.98.68'

Onde "11:13:56" pode ser a qualquer momento.

Isso é o que eu criei:

tail -n 100000 gateway.log | grep -B10 -A10 'Nov 22 [0-9]:[0-9]:[0-9] Received Packet from [10.50.98.68'

Não sei ao certo o que está se referindo quando diz "inigualável [". Esta parte "[0-9]: [0-9]: [0-9]" é suposto ser regex. Esta parte "[10.50.98.68" é uma string.

    
por JohnMerlino 27.11.2013 / 20:21

2 respostas

6

Em uma expressão regular do grep, [ é um caractere especial . Para um literal [ , você precisa excluir a barra invertida, assim: \[ .

Observe que a totalidade de Nov 22 [0-9]: ... [10.50.98.68 é uma expressão regular. Você não pode simplesmente apontar para ele e dizer "esta parte é uma regex, esta parte deve ser uma string literal" e espere que grep seja capaz de ler seus pensamentos. É por isso que você precisa escapar de qualquer caractere especial que faça parte das sequências literais que deseja corresponder.

Não relacionado, mas cada ocorrência de [0-9] em sua expressão regular corresponde apenas a um único caractere. Além disso, . é um caractere especial que também precisará ser escapado. Você provavelmente quer algo parecido com o seguinte para sua expressão regular:

^Nov 22 [0-9][0-9]:[0-9][0-9]:[0-9][0-9] Received Packet from \[10\.50\.98\.68
    
por 27.11.2013 / 20:37
4

coloque a barra invertida antes do último colchete na linha (que é inigualável) [é um caractere especial no regex das classes.

Então você quer:

 tail -n 100000 gateway.log | grep -B10 -A10 'Nov 22 [0-9]:[0-9]:[0-9] Received Packet from \[10.50.98.68'

Além disso, como a outra resposta diz, você tem outros problemas com sua regex, como períodos que você quer que sejam literais, e o fato de permitir apenas um número entre cada dois pontos que falhará em algumas horas do dia. Pelo tempo que você quiser, [0-9]\{1,2\}:[0-9]\{1,2\}:[0-9]\{1,2\} e pelo endereço IP, se você quiser um regex que corresponda a qualquer endereço IP válido, é mais complicado do que você imagina. Você não disse se o IP vai mudar ou não.

    
por 27.11.2013 / 20:35