grep para caracteres especiales en Unix

95

Tengo un archivo de registro (application.log) que puede contener la siguiente cadena de caracteres normales y especiales en varias líneas:

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

Quiero buscar el (los) número (s) de línea que contiene esta cadena de caracteres especiales.

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

El comando anterior no devuelve ningún resultado.

¿Cuál sería la sintaxis correcta para obtener los números de línea?

Avinash Sonee
fuente
^@: significa ^seguido de @o carácter nulo?
Nahuel Fouilleul

Respuestas:

159

Dile grepque trate tu entrada como una cadena fija usando la -Fopción.

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

-nSe requiere la opción para obtener el número de línea,

grep -Fn '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
Príncipe Juan Wesley
fuente
7
Dependiendo de su versión de grep sólo tiene que escapar (con una barra invertida) ^, $, ., *y \ . o puedes intentarlo fgreptambién.
Nahuel Fouilleul
2
@NahuelFouilleul: +1. por cierto, fgrepes lo mismo que grep -F.
Prince John Wesley
@PrinceJohnWesley: es lo mismo, pero en algunos sistemas hay muchas versiones de grep, por lo que el uso de fgrep puede encontrar la versión que admite -F
Nahuel Fouilleul
¿Y si lo usa egrep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log?
inckka
No funciona. grep -rinF '-static'impresiones Invalid option «t». La respuesta de @ Mani funcionó , es decir grep -rin "\-static".
Hi-Angel
93

El que funcionó para mí es:

grep -e '->'

La -e significa que el siguiente argumento es el patrón y no se interpretará como un argumento.

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

Tom Brito
fuente
str = '! "# $% & () * +, -. /:; <=>? @ [\] ^ _` {|} ~ '; echo "$ str" | grep -e "$ str" ..... NO FUNCIONA, lo que funcionó para usted no tenía suficientes caracteres especiales además del signo de cambio '-', ¡pero win -F en lugar de -e está FUNCIONANDO!
THESorcerer
1
Lo único que funciona para mí, incluso '\' o -F o fgrep no funcionan. ¡Gracias!
user180574
2
Esta debería ser la respuesta aceptada - simple y funciona para grep
Ishay Peled
1
Intenté -F y fgrep no funcionan para mí cuando busco una cadena que incluya '-' char. Esto funciona.
世界 知名 伟人
Me pregunto por qué esta respuesta está presente en esta pregunta ( stackoverflow.com/q/12387685 como referencia a las preguntas y respuestas que estoy viendo actualmente): ¿probablemente un caso incorrecto de respuestas fusionadas de otra pregunta? Para buscar patrones que comiencen con -, consulte también stackoverflow.com/questions/2427913/…
Domingo
6

Una nota relacionada

Para grep para el retorno de carro, es decir, el \rcarácter, o 0x0d, podemos hacer esto:

grep -F $'\r' application.log

Alternativamente, use printf, o echo, para compatibilidad POSIX

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

Y podemos usar hexdump, o lesspara ver el resultado:

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

Con respecto al uso de $'\r'y otros caracteres compatibles, consulte el Manual de Bash> Citas ANSI-C :

Las palabras de la forma $ 'cadena' se tratan especialmente. La palabra se expande a una cadena, con caracteres de escape con barra invertida reemplazados según lo especificado por el estándar ANSI C

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

Puede intentar eliminar los caracteres alfanuméricos y los espacios. Y luego use -nle dará el número de línea. Intente seguir:

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

R. Kumar
fuente
Gracias ... Me funciona bien encontrar los caracteres especiales de un archivo.
Dipankar Nalui
-4

Pruebe vi con la opción -b, esto mostrará caracteres especiales de final de línea (normalmente lo uso para ver los finales de línea de Windows en un archivo txt en un sistema operativo Unix)

Pero si desea una solución con script, obviamente vi no funcionará, así que puede probar las opciones -f o -e con grep y canalizar el resultado a sed o awk. Desde la página de manual de grep:

Matcher Selection -E, --extended-regexp Interpreta PATTERN como una expresión regular extendida (ERE, ver más abajo). (-E lo especifica 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.)
usuario7648830
fuente
2
¿De qué manera esto es mejor que una respuesta aceptada por lo que lo agregó a una pregunta de hace casi 5 años?
SergGr