Com awk
, como em perl
, você terá que agrupar os termos em //
, mas isso pode ser feito:
awk '(/term1/ && /term2/) || (/term1/ && xor(/term3/, /term4/))'
Existe um utilitário semelhante ao grep que me permitirá fazer buscas no grep com operadores lógicos? Eu quero ser capaz de aninhar e combinar as construções lógicas livremente. Por exemplo, coisas como essa devem ser possíveis:
grep (term1 && term2) || (term1 && (term3 xor term4)) *
Sei que isso pode ser feito com vanilla grep e script adicional de bash, mas meu objetivo aqui é evitar ter que fazer isso.
Existem várias maneiras de usar grep
com operadores lógicos.
Use
\|
para separar vários padrões para a condição OR .
Exemplo: grep 'pattern1\|pattern2' filename
Use a opção -E
para enviar vários padrões para o OR
condição.
Exemplo: grep -E 'pattern1|pattern2' filename
Usar um único -e
corresponde apenas a um padrão, mas usando vários
A opção -e
corresponde a mais de um padrão.
Exemplo: grep -e pattern1 -e pattern2 filename
grep -v
pode simular a operação NOT .
Não há nenhum operador AND em grep
, mas você pode usar a força bruta
simule AND usando a opção -E
.
Exemplo: grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename
O exemplo acima irá corresponder a todas as linhas que contenham pattern1 e pattern2 em qualquer ordem.
Você pode usar o perl:
perl -wne 'print if (/term1/ && /term2/) || (/term1/ && (/term3/ xor /term4/))'
Eu uso para encadear comandos grep
para obter um AND lógico:
grep expr1 filename | grep expr2
Eu acredito que é bem direto, parecido com o Unix e elegante.
Então você pode combinar (como explicado pelo @Tushi) com a opção -E
para OR e -v
para negação.
Seu exemplo específico é bastante desagradável e provavelmente se beneficiaria de algum utilitário mais poderoso (veja a resposta de @ muru).
sed '/term1/!d;/term2/b' -e '/term3/!d;/term4/d' *
Eu acredito que realiza o que você está tentando fazer. Ele d
elimina da saída qualquer linha que não corresponda a term1
, ele b
sai do script (e, assim, autoprints) qualquer linha que permaneça e corresponda a term2
, e para as linhas que permanecem exclui as que não corresponderem a term3
e daquelas que corresponderem a term4
.
sed
scripts são avaliados em ordem, e todos os testes são booleanos, portanto, quaisquer ações resultantes de um teste afetarão diretamente o comportamento de quaisquer ações a seguir.
Tags grep