Como fazer barra vertical | trabalhar no grep?

8

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

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

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

Eu tentei escapar das barras e isso melhorou um pouco as coisas - o valor do meio foi detectado, mas não o primeiro ou o último.

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

Eu também tentei double escapes e voltei a não obter resultados.

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

O que estou fazendo de errado? Obrigado.

    
por Mark Ransom 15.09.2010 / 20:41

2 respostas

14

A sintaxe que você está tentando usar pertence a expressões regulares estendidas, portanto, a resposta é muito simples, use egrep ou inclua o -E flag.

    
por 15.09.2010 / 20:53
16

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

In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, +, {, \|, (, and ).

Assim, você pode fazer o seguinte:

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

ou

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

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

    
por 15.09.2010 / 21:05

Tags