grep para caracteres especiais no Unix


92

Eu tenho um arquivo de log (application.log) que pode conter a seguinte sequência de caracteres normais e especiais em várias linhas:

*^%Q&$*&^@$&*!^@$*&^&^*&^&

Desejo pesquisar o (s) número (s) de linha que contém essa seqüência de caracteres especial.

grep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

O comando acima não retorna nenhum resultado.

Qual seria a sintaxe correta para obter os números das linhas?


^@: significa ^seguido por um @caractere nulo?
Nahuel Fouilleul

Respostas:


154

Diga greppara tratar sua entrada como string fixa usando a -Fopção.

grep -F '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

A opção -né necessária para obter o número da linha,

grep -Fn '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

7
Dependendo a sua versão do grep você só precisa escapar (com uma barra invertida) ^, $, ., *e \ . ou você pode tentar fgreptambém.
Nahuel Fouilleul

2
@NahuelFouilleul: +1. btw, fgrepé o mesmo que grep -F.
Príncipe John Wesley

@PrinceJohnWesley: é o mesmo, mas em alguns sistemas existem muitas versões do grep, portanto, usando o fgrep pode-se encontrar a versão que suporta -F
Nahuel Fouilleul

E se ele usar egrep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log?
Inckka

Não funciona. grep -rinF '-static'impressões Invalid option «t». A resposta do @ Mani funcionou , ou seja grep -rin "\-static".
Hi-Angel

89

O que funcionou para mim é:

grep -e '->'

O -e significa que o próximo argumento é o padrão e não será interpretado como um argumento.

De: http://www.linuxquestions.org/questions/programming-9/how-to-grep-for-string-769460/


str = '! "# $% & () * +, -. /:; <=>? @ [\] ^ _` {|} ~ '; echo "$ str" | grep -e "$ str" ..... NÃO ESTÁ FUNCIONANDO, o que funcionou para você não tinha caracteres especiais suficientes além do sinal de troca '-', mas ganhe -F em vez de -e está FUNCIONANDO!
THESorcerer

1
A única coisa funciona para mim, mesmo '\' ou -F ou fgrep não funcionam. Obrigado!
user180574

2
Esta deve ser a resposta aceita - simples e funciona para grep
Ishay Peled

1
Tentei -F e fgrep não funcionam para mim ao pesquisar uma string incluem '-' char. Isso funciona.
世界 知名 伟人

Estou me perguntando por que esta resposta está presente nesta pergunta ( stackoverflow.com/q/12387685 para referência às perguntas e respostas que estou visualizando no momento) - provavelmente um caso errado de respostas sendo mescladas de outra pergunta? Para pesquisar padrões começando com -, consulte também stackoverflow.com/questions/2427913/…
Sundeep

6

Uma nota relacionada

Para grep para retorno de carro, ou seja, o \rcaractere, ou 0x0d, podemos fazer isso:

grep -F $'\r' application.log

Como alternativa, use printf, ou echo, para compatibilidade POSIX

grep -F "$(printf '\r')" application.log

E podemos usar hexdump, ou lesspara ver o resultado:

$ printf "a\rb" | grep -F $'\r' | hexdump -c
0000000   a  \r   b  \n

Com relação ao uso de $'\r'e outros caracteres suportados, consulte Bash Manual> ANSI-C Quoting :

Palavras da forma $ 'string' são tratadas de maneira especial. A palavra se expande para string, com caracteres de escape de barra invertida substituídos conforme especificado pelo padrão ANSI C


3
grep -n "\*\^\%\Q\&\$\&\^\@\$\&\!\^\@\$\&\^\&\^\&\^\&" test.log
1:*^%Q&$&^@$&!^@$&^&^&^&
8:*^%Q&$&^@$&!^@$&^&^&^&
14:*^%Q&$&^@$&!^@$&^&^&^&

2

Você pode tentar remover qualquer caractere alfanumérico e espaço. Em seguida, use -nfornecerá o número da linha. Tente seguir:

grep -vn "^[a-zA-Z0-9 ]*$" application.log


Obrigado. Para mim, funciona bem encontrar os caracteres especiais de um arquivo.
Dipankar Nalui

-4

Tente vi com a opção -b, isso mostrará caracteres especiais de fim de linha (eu normalmente o uso para ver terminações de linha do Windows em um arquivo txt em um sistema operacional unix)

Mas se você quiser uma solução com script obviamente o vi não funcionará, então você pode tentar as opções -f ou -e com grep e canalizar o resultado para sed ou awk. Da página de manual do grep:

Seleção do Matcher -E, --extended-regexp Interpretar PATTERN como uma expressão regular estendida (ERE, veja abaixo). (-E é especificado por POSIX.)

   -F, --fixed-strings
          Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.  (-F is specified
          by POSIX.)

2
De que forma isso é melhor do que uma resposta aceita, então você a adicionou a uma pergunta de quase 5 anos?
SergGr
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.