Estou tentando usar grep
para coincidir com linhas que contêm duas seqüências diferentes. Eu tentei o seguinte, mas isso corresponde a linhas que contêm string1 ou string2 que não é o que eu quero.
grep 'string1\|string2' filename
Então, como faço para corresponder grep
apenas às linhas que contêm as duas strings ?
Respostas:
Você pode usar
grep 'string1' filename | grep 'string2'
Ou,
grep 'string1.*string2\|string2.*string1' filename
fonte
grep -e "string1" -e "string2"
Eu acho que é isso que você estava procurando:
Eu acho que respostas como esta:
corresponde apenas ao caso em que ambos estão presentes, não um ou outro ou ambos.
fonte
grep -e "string1" -e "string2" filename
faria o mesmo?How do I match lines that contains *both* strings?
Para procurar arquivos que contenham todas as palavras em qualquer ordem em qualquer lugar:
O primeiro grep inicia uma pesquisa recursiva (
r
), ignorando maiúsculasi
e minúsculas ( ) e listando (imprimindo) o nome dos arquivos que correspondem (l
) para um termo ('action'
com aspas simples) ocorrendo em qualquer lugar do arquivo.Os greps subsequentes pesquisam os outros termos, mantendo a distinção entre maiúsculas e minúsculas e listando os arquivos correspondentes.
A lista final dos arquivos que você receberá será os que contêm esses termos, em qualquer ordem em qualquer lugar do arquivo.
fonte
grep -ril 'foo' | xargs -d '\n' grep -il 'bar'
Se você tem um
grep
com uma-P
opção para um limitadoperl
regex, você pode usarque tem a vantagem de trabalhar com seqüências sobrepostas. É um pouco mais direto usar
perl
comogrep
, porque você pode especificar a lógica e mais diretamente:fonte
Seu método era quase bom, faltando apenas o -w
fonte
grep -V
.grep -w 'regexp1\|regexp2' filename
O
|
operador em uma expressão regular significa or. Ou seja, string1 ou string2 corresponderão. Você poderia fazer:que canalizará os resultados do primeiro comando para o segundo grep. Isso deve fornecer apenas linhas que correspondam a ambos.
fonte
Você pode tentar algo como isto:
fonte
E como as pessoas sugeriram perl e python, e scripts de shell complicados, aqui uma abordagem simples do awk :
Tendo analisado os comentários para a resposta aceita: não, isso não funciona com várias linhas; mas também não foi isso que o autor da pergunta pediu.
fonte
Não tente usar grep para isso, use awk. Para combinar 2 regexps R1 e R2 no grep, você pensaria que seria:
enquanto no awk seria:
mas e se se
R2
sobrepuser a ou é um subconjunto deR1
? Esse comando grep simplesmente não funcionaria enquanto o comando awk funcionaria. Digamos que você deseja encontrar linhas que contenhamthe
eheat
:Você precisaria usar 2 greps e um pipe para isso:
e, é claro, se você realmente exigiu que eles fossem separados, você sempre pode escrever no awk o mesmo regexp que você usou no grep e existem soluções alternativas do awk que não envolvem repetir os regexps em todas as seqüências possíveis.
Deixando isso de lado, e se você quisesse estender sua solução para corresponder a três regexps R1, R2 e R3. No grep, essa seria uma dessas más escolhas:
enquanto no awk, seria conciso, óbvio, simples, eficiente:
Agora, e se você realmente quisesse combinar as cadeias literais S1 e S2 em vez das regexps R1 e R2? Você simplesmente não pode fazer isso em uma chamada para grep, você deve escrever um código para escapar de todos os metacarpos do RE antes de chamar grep:
ou use 2 greps e um pipe:
que novamente são más escolhas, enquanto que com o awk você simplesmente usa um operador de string em vez do operador regexp:
Agora, e se você quisesse corresponder 2 regexps em um parágrafo em vez de uma linha? Não pode ser feito no grep, trivial no awk:
Que tal um arquivo inteiro? Novamente, não pode ser feito em grep e trivial em awk (desta vez, estou usando o GNU awk para multi-char RS por concisão, mas não há muito mais código em nenhum awk ou você pode escolher um char de controle que você sabe que não estar na entrada para o RS fazer o mesmo):
Portanto, se você deseja encontrar vários regexps ou strings em uma linha ou parágrafo ou arquivo, não use grep, use awk.
fonte
awk '/R1/ && /R2/'
diferencia maiúsculas de minúsculas?awk -v IGNORECASE=1 '/R1/ && /R2/'
e com qualquer awkawk '{x=toupper($0)} x~/R1/ && x~/R2/'
GNU grep versão 3.1
fonte
Linhas encontradas que começam apenas com 6 espaços e terminam com:
fonte
Digamos que precisamos encontrar a contagem de várias palavras em um arquivo de teste de arquivo. Existem duas maneiras de fazer isso
1) Use o comando grep com padrão de correspondência regex
2) Use o comando egrep
Com o egrep, você não precisa se preocupar com a expressão e apenas separar as palavras por um separador de tubulação.
fonte
git grep
Aqui está a sintaxe usando
git grep
vários padrões:Você também pode combinar padrões com expressões booleanas como
--and
,--or
e--not
.Procure
man git-grep
ajuda.Outros parâmetros a considerar:
Para alterar o tipo de padrão, você também pode usar
-G
/--basic-regexp
(default),-F
/--fixed-strings
,-E
/--extended-regexp
,-P
/--perl-regexp
,-f file
e outros.Palavras-chave:
Para operação OR , consulte:
fonte
Coloque as strings que você deseja grep em um arquivo
Em seguida, pesquise usando -f
fonte
vai ficar alinhado com string1 e string2 em qualquer ordem
fonte
Isso funciona para correspondência exata de palavras e palavras sem distinção entre maiúsculas e minúsculas, pois -i é usado
fonte
para correspondência de várias linhas:
ou
só precisamos remover o caractere de nova linha e ele funciona!
fonte
Você deveria ter
grep
assim:fonte
Geralmente encontro o mesmo problema que o seu e acabei de escrever um pedaço de script:
Uso:
Você pode colocá-lo em .bashrc, se quiser.
fonte
Quando as duas strings estiverem em sequência, coloque um padrão no
grep
comando:Exemplo se as seguintes linhas estiverem contidas em um arquivo chamado
Dockerfile
:Para obter a linha que contém as seqüências de caracteres:
FROM python
eas build-python
depois use:A saída mostrará apenas a linha que contém as duas strings :
fonte
ripgrep
Aqui está o exemplo usando
rg
:É uma das ferramentas de grepping mais rápidas, pois é construída sobre o mecanismo de regex da Rust, que usa autômatos finitos, SIMD e otimizações literais agressivas para tornar a pesquisa muito rápida.
Use-o, especialmente quando você estiver trabalhando com dados grandes.
Consulte também solicitação de recurso relacionado em GH-875 .
fonte
string2
aparece antesstring1
. A solução mais simples para esse problema érg string1 file.txt | rg string2
.