ack + grep + não corresponde realmente à cadeia

1

Eu uso a ferramenta ack (como o grep, mas mais strong) para corresponder strings em arquivos

Por favor, dê uma olhada no seguinte exemplo de ACK

  ./ack -a 127.0.0.1 /var/ntp/ntpstats/file

   55305 57262.736 10.106.190.191 9624 0.000460 0.00127 0.00168

Eu quero pesquisar apenas o IP 127.0.0.1 em / var / ntp / ntpstats / file

mas ack retorna a linha:

   55305 57262.736 10.106.190.191 9624 0.000460 0.00127 0.00168

Então parece que ack combina com o 127.0.0.1, mas na verdade a linha não tem o endereço 127.0.0.1

Alguém pode me dar conselhos sobre como combinar exatamente com a ferramenta ack? (talvez algumas bandeiras perdidas após ack?)

obrigado

    
por jennifer 14.10.2010 / 11:25

3 respostas

3

O . é um caractere meta em Perl. Significa "combinar com qualquer personagem". Você tem três opções.

  • ack '127\.0\.0\.1' Isso cita cada período, fazendo com que cada um seja um período real.
  • ack '\Q127.0.0.1' Nos regexes Perl, \Q significa "citar todos os metacaracteres após o \ Q"
  • ack -Q 127.0.0.1 Como o \Q é tão comum, o ack tem a opção -Q , o que significa a mesma coisa.

Além disso, vejo você usando a opção -a , presumivelmente para garantir a correspondência de arquivos que não possuem uma extensão. Isso é desnecessário se você especificar um arquivo para pesquisar.

    
por 14.10.2010 / 16:19
2

Um . em uma expressão regular corresponde a qualquer caractere diferente de uma nova linha. Você precisará escapar se quiser corresponder a um período literal.

./ack -a '127\.0\.0\.1' /var/ntp/ntpstats/file
    
por 14.10.2010 / 11:48
0

Apenas para elaborar a resposta de Ignacio:

55305 57262.736 10.106.190.191 9624 0.000460 0.00127 0.00168
                                                 ^^^^^^^^^

Como você pode ver, com o caractere original (.), a parte acima da linha corresponde aos seus critérios de pesquisa.

    
por 14.10.2010 / 13:08

Tags