Encontre a string exata com grep

9

a título de exemplo, eu tenho um grande arquivo de texto com muitos endereços de e-mail, usando o bash eu preciso pesquisar / verificar se existe um e-mail (ou não). Deve ser usado (apenas) as "âncoras"?

grep '^[email protected]' text_file

ou há maneiras melhores? Eu preciso criar um script bash e eu gostaria de estar seguro.

    
por Pol Hallen 24.07.2014 / 14:56

5 respostas

24

Veja as opções -F (string fixa, em oposição à expressão regular) e -x (exata: corresponde à linha inteira).

grep -Fx [email protected] text_file

seria o equivalente de:

grep '^user1@example\.com$' text_file

(lembre-se que . é um operador de expressão regular que corresponde a qualquer caractere).

Use a opção -q se você quiser apenas verificar se existe essa linha:

grep -Fxq [email protected] text_file &&
  echo yes, that address is in that file.

Se a linha a pesquisar e o nome do arquivo forem variáveis:

grep -Fxqe "$email" < "$file"

Ou

grep -Fxq -- "$email" < "$file"

Você não quer:

grep -Fxq "$email" "$file"

pois isso causaria problemas se $email ou $file começassem com - .

Se o arquivo estiver classificado (na sua localidade atual, preferencialmente C ), você poderá acelerar as coisas usando comm em vez de grep :

printf '%s\n' [email protected] | comm -12 - text_file

A vantagem ficará mais óbvia quando você tiver vários endereços de e-mail para verificar (por exemplo, em outro arquivo classificado):

comm -12 text_file emails_to_check

seria mais rápido que:

grep -Fxf emails_to_check text_file
    
por 24.07.2014 / 15:08
5

Para ser o mais eficiente possível, você quer parar após a primeira correspondência ser encontrada. Se você tem o GNU grep , você pode fazer isso:

grep -m 1 '^user1@example\.com$' your_file

Se você não fizer isso, você pode usar o Perl:

perl -nlE 'say and last if $_ eq q{[email protected]}' your_file
    
por 24.07.2014 / 15:03
3

Existem muitas verificações por email. Um deles é:

grep -E -o "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" text_file

Para elaborar minha resposta.

Você está usando a ^ anchor, que indica o início da string. Isso não coincidirá se um endereço de e-mail estiver em algum lugar entre uma string longa.

    
por 24.07.2014 / 14:59
2

Seu comando grep corresponderá a tudo que começa com ^[email protected] , incluindo o endereço de e-mail em si, mas também [email protected] . como . é um caractere especial em expressões regulares que corresponde a qualquer chave, você deve escapar como \.

assumindo que seu arquivo de texto contém um endereço por linha, use:

EMAIL=user1@example\.com
egrep "^${EMAIL}$" text_file

o trailing $ certifica-se de que a linha termina após o endereço de email. Eu também estou usando aspas duplas " , pois elas permitem usar variáveis (ao contrário daspas simples ' )

    
por 24.07.2014 / 15:01
0

Considerando a correspondência literal de cadeia literal / exata:

grep -w "search_word" <file>  >  output.txt

#\b shows boundaries over here.

ou

 grep  "\bsearch_word\b"  <file>  >  output.txt 
    
por 11.05.2016 / 20:46

Tags