Como fazer barra vertical | trabalhar em grep?


10

Aqui está um exemplo de uma linha de comando grep que tentei:

grep '(565172|565173|565175)' /var/log/cups/error_log

Não produz nenhuma saída, mesmo que todos os três valores estejam no arquivo várias vezes.

Tentei escapar das barras, e isso melhorou um pouco as coisas - o valor médio foi detectado, mas não o primeiro ou o último.

grep '(565172\|565173\|565175)' /var/log/cups/error_log

Eu também tentei escapadas duplas e voltei a não obter resultados.

grep '(565172\\|565173\\|565175)' /var/log/cups/error_log

O que estou fazendo errado? Obrigado.

Respostas:


14

A sintaxe que você está tentando usar pertence a expressões regulares estendidas; portanto, a resposta é muito simples, use egrepou inclua o -Esinalizador.


17

O que você está enfrentando é a diferença entre expressões regulares básicas e estendidas. Na página de manual do grep:

Nas expressões regulares básicas, os meta-caracteres?, +, {, |, (, E) perdem seu significado especial; em vez disso, use as versões com barra invertida \ ?, +, {, \ |, (, e).

Assim, você pode executar um dos seguintes procedimentos:

 grep '\(565172\|565173\|565175\)' /var/log/cups/error_log

ou

grep -E '(565172|565173|565175)' /var/log/cups/error_log

O sinalizador -E ativa expressões regulares "Estendidas". O GNU grep também suporta expressões regulares compatíveis com perl.


Me distraí ao escrever minha resposta. Parece que Adam me venceu.
Steven D

4
Mas você adicionou à explicação - a razão pela qual eu não consegui fazê-lo funcionar é que estava escapando apenas do bar e não das parênteses.
Mark Ransom

1
Eu não sabia que você pode escapar desses caracteres especiais mais uma vez para obter o mesmo resultado, então +1 para você!
Adam Byrtek

1
O acima é o conjunto de trocas mais civilizado que eu já vi no SO / SE.
mike roedor
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.