Como usar grep para 2 linhas diferentes

15

Como posso procurar por duas frases diferentes quando elas estão em duas linhas diferentes usando um único grepcomando?

Por exemplo

Linha 1: Isso é um doce.

Linha 2: limão.

Eu usei isso, mas nenhum resultado

grep "sweet.*lemon" file_type
Vijay Chakraborty
fonte

Respostas:

20

Para usar greppara duas linhas diferentes, pesquise os dois padrões

$ grep -e sweet -e lemon file_type
This is a sweet
lemon.

Ou use alternância

$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.

Para obter a próxima linha após um padrão, você pode usar a opção de contexto

$ grep -A1 sweet file_type
This is a sweet
lemon.

Mas se você estiver procurando explicitamente para um padrão de múltiplas linhas, isso é porque complicada greppensa em linhas ... . Você .*vai pegar tudo entre "doce" e "limão" na linha . Podemos obter "limão" na próxima linha -Pusando \npara corresponder à nova linha e dizendo que grepo arquivo é nulo separado por -z:

$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.

Notas:

  • -EUse expressões regulares estendidas (para usar |caracteres para alternância sem precisar escapar)
  • -An Imprima linhas adicionais após o padrão, em que n é o número de linhas finais a serem impressas
  • -PUse expressões regulares no estilo perl (em vez de "experimental" em grepinstall pcregreppara obter melhor suporte ao perl regex)
  • -zUse o caractere nulo como separador (apenas fingindo neste caso, mas grepaceitaremos nossa palavra)
  • -o imprima apenas a peça correspondente
Zanna
fonte
Embora o grep -zPcomando funcione nesse caso específico (um arquivo que consiste exatamente de duas linhas), em geral, qualquer arquivo separado por nova linha comum é uma única linha; portanto, despeje todo o conteúdo do arquivo (se houver uma correspondência em algum lugar) ou nada; geralmente não é para isso que as pessoas usam grep.
10266 Marc Marie Leeuwen
sim isso só é útil com -o... editado ...
Zanna
Caso isso seja tentado em outras distros, você poderá encontrar: grep: The -P and -z options cannot be combined- por exemplo, grep (GNU grep) 2.5.1 no RHEL
Jason Pyeron
6

Como isso:

grep "sweet\|lemon"
madneon
fonte
desculpe, mas isso vai corresponder exatamente ao "doce | limão"
αғsнιη 10/12/16
4
@KasiyA Esta linha está funcionando bem. greppor padrão, funciona no "modo padrão", onde "caracteres especiais" |, como +, *são interpretados literalmente, a menos que sejam mascarados com uma barra invertida. Veja, por exemplo, esta resposta . Para usar do jeito que você provavelmente está acostumado, que "caracteres especiais" precisam ser mascarados para serem interpretados literalmente, você precisa mudar para o "modo estendido" ( grep -E). Talvez madneon poderia elaborar um pouco mais sobre suas respostas, por exemplo o que os OPs tente iria ter acompanhado?
Henning Kockerbeck