Grep para strings literais

101

Estou atrás de uma ferramenta do tipo grep para pesquisar strings puramente literais. Estou procurando a ocorrência de uma linha de um arquivo de log, como parte de uma linha em um arquivo de log separado. O texto da pesquisa pode conter todos os tipos de caracteres especiais regex, por exemplo []().*^$-\,.

Existe um utilitário de pesquisa Unix que não usaria regex, mas apenas procuraria ocorrências literais de uma string?

Ben
fonte
Eu me pergunto por que a pergunta não foi "Posso fazer uma grepbusca por strings literais?" em vez de "Existe algo assim greppode pesquisar strings literais?" ;)
Chaves de

Respostas:

136

Você pode usar grep para isso, com a opção -F.

-F, --fixed-strings       PATTERN is a set of newline-separated fixed strings
Scott Stafford
fonte
"strings fixas separadas por nova linha" Como posso fazer isso no prompt do terminal? Sei que posso criar um arquivo de padrão, mas sem um arquivo, é possível fazer no prompt? Pressionar Enter obviamente executa o comando.
ADTC
13
Vou responder minha própria pergunta. :) Você só precisa fornecer as várias strings fixas usando repetições da -eopção. Como esta: grep -F -e "fixed1" -e "fixed2" -e "fixed3" -e "fixed4". Não são necessárias novas linhas;)
ADTC de
2
Não disponível no Solaris. Em vez disso, fgrepé usado.
majkinetor de
2
@ADTC Eu descobri que precisava usar aspas simples para a string pesquisada contendo apenas caracteres especiais, caso contrário, nada será encontrado. Portanto, isso não retornou nenhum resultado: O grep --include=\*.php -FRn -e "$$"uso de citações simples me deu o resultado desejado:grep --include=\*.php -FRn -e '$$'
Piemol
2
Você está correto @ADTC. $e alguns outros caracteres são especiais e serão substituídos por bash depois que você clicar em enter e antes grep(ou qualquer comando) ser executado. Você pode dizer ao bash para deixar todos os caracteres (exceto as aspas simples) intocados, colocando-os entre aspas simples. Se você precisar digitar uma aspa simples, faça assim'I'\''m special'
ndemou
14

Isso é fgrepou grep -Fnão fará expressões regulares. fgrepé idêntico, grep -Fmas prefiro não ter que me preocupar com as discussões, sendo intrinsecamente preguiçoso :-)

grep   ->  grep
fgrep  ->  grep -F  (fixed)
egrep  ->  grep -E  (extended)
rgrep  ->  grep -r  (recursive, on platforms that support it).
paxdiablo
fonte
Para GNU grep, fgrep é fornecido apenas como um link simbólico para grep, o que o torna -F
Daenyth
3
egrepe fgrepnão são especificados pelo padrão POSIX; grep -Fe grep -E são
Richard Hansen
4

Passe -Fpara grep.

Ignacio Vazquez-Abrams
fonte
3

você também pode usar awk, pois ele tem a capacidade de encontrar strings fixas, bem como recursos de programação, por exemplo, apenas

awk '{for(i=1;i<=NF;i++) if($i == "mystring") {print "do data manipulation here"} }' file
ghostdog74
fonte
2
cat list.txt
one:hello:world
two:2:nothello

three:3:kudos

grep --color=always -F"hello

three" list.txt

resultado

one:hello:world
three:3:kudos
Parandhaman
fonte
2
Eu não concordo. É uma ilustração útil de como isso funciona.
timwaagh