varias - grep para personajes especiales en Unix
usar grep (6)
Una nota relacionada
Para grep para retorno de carro, es decir, el carácter /r
, o 0x0d
, podemos hacer esto:
grep -F $''/r'' application.log
Alternativamente, use printf
, o echo
, para la compatibilidad con POSIX
grep -F "$(printf ''/r'')" application.log
Y podemos usar hexdump
, o less
para ver el resultado:
$ printf "a/rb" | grep -F $''/r'' | hexdump -c
0000000 a /r b /n
En cuanto al uso de $''/r''
y otros caracteres admitidos, consulte Bash Manual> ANSI-C Quoting :
Las palabras de la forma $ ''cadena'' se tratan especialmente. La palabra se expande a cadena, con caracteres escapados de barra invertida reemplazados según lo especificado por el estándar ANSI C
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 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?
Dile a grep
que trate tu entrada como cadena fija usando la opción -F
.
grep -F ''*^%Q&$*&^@$&*!^@$*&^&^*&^&'' application.log
Se requiere la opción -n
para obtener el número de línea,
grep -Fn ''*^%Q&$*&^@$&*!^@$*&^&^*&^&'' application.log
El que funcionó para mí es:
grep -e ''->''
El -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/
Podría intentar eliminar cualquier espacio y caracteres alfanuméricos. Y luego use -n
le dará el número de línea. Pruebe lo siguiente:
grep -vn "^[a-zA-Z0-9 ]*$" application.log
Pruebe vi con la opción -b, esto mostrará caracteres especiales de final de línea (normalmente lo uso para ver las terminaciones de línea de Windows en un archivo txt en un sistema operativo Unix)
Pero si quieres una solución con guiones obviamente vi no funcionará, así que puedes probar las opciones -f o -e con grep y canalizar el resultado en sed o awk. De la página de grep man:
Matcher Selection -E, --extended-regexp Interpreta PATTERN como una expresión regular extendida (ERE, ver a continuación). (-E es 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.)
grep -n "/*/^/%/Q/&/$/&/^/@/$/&/!/^/@/$/&/^/&/^/&/^/&" test.log
1:*^%Q&$&^@$&!^@$&^&^&^&
8:*^%Q&$&^@$&!^@$&^&^&^&
14:*^%Q&$&^@$&!^@$&^&^&^&