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?


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

"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).

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


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

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

2
Eu não concordo. É uma ilustração útil de como isso funciona.
timwaagh
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.