grep
não faz operações AND lógicas (por exemplo, match patternA AND patternB
), o mais próximo que você pode chegar é construir um regexp mais longo que corresponda a qualquer uma das variações possíveis (por exemplo, grep -E 'patternA.*patternB|patternB.*patternA'
). Isso fica muito desajeitado e pesado se você tiver muitos padrões para combinar.
A maneira mais fácil de fazer o que você deseja é usar uma linguagem de script como awk
ou perl
em vez de grep
.
por exemplo. o seguinte awk
one-liner corresponderá a qualquer linha em que ambos os padrões sejam exibidos.
awk '/patternA/ && /patternB/'
Qualquer uma das correspondências de padrão pode ser invertida também, por exemplo, se você quiser corresponder qualquer linha que contenha patternA que não contenha patternB (ou seja, uma operação AND NOT ):
awk '/patternA/ && ! /patternB/'
Nota: uma abordagem ingênua é usar grep patternA | grep patternB
(ou grep patternA | grep -v patternB
) - que faz atingir um AND lógico (ou AND NOT), mas com o custo de executar vários comandos grep
em vez de um único comando awk
ou perl
.