devuelve grep
Coincidencias de archivo binario test.log
Por ejemplo
echo "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log # in zsh
echo -e "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log # in bash
grep re test.log
Deseo que el resultado muestre la línea 1 y la línea 3 (dos líneas en total).
¿Es posible tr
convertir los datos no imprimibles en datos legibles para que grep vuelva a funcionar?
-e
en elecho
comando?Respuestas:
Puede ejecutar el archivo de datos
cat -v
, por ejemploque luego podría procesarse posteriormente para eliminar la basura; esto es más análogo a su consulta sobre el uso
tr
para la tarea.fuente
man cat
-v
-v, --show-nonprinting
use ^ and M- notation, except for LFD and TAB
set | cat -v | grep variable
grep --text
no siempre funciona; respeta CTRL + D como terminador de archivos. Entonces, si tiene eso en su archivo binario, grep saldrá temprano.No puede ser más simple que eso.
fuente
grep --text
que paxdiablo ha mencionado 2 años antesLC_ALL="C" grep -a
Una forma es simplemente tratar los archivos binarios como texto de todos modos,
grep --text
pero esto puede resultar en que se envíe información binaria a su terminal. Eso no es realmente una buena idea si está ejecutando un terminal que interpreta el flujo de salida (como VT / DEC o muchos otros).Alternativamente, puede enviar su archivo
tr
con el siguiente comando:Esto cambiará cualquier carácter menor que un espacio (excepto una nueva línea) y algo mayor que 126, en un
.
carácter, dejando solo los imprimibles.Si desea que cada carácter "ilegal" sea reemplazado por uno diferente, puede usar algo como el siguiente programa en C, un filtro de entrada estándar clásico:
Esto le dará
{{NN}}
dóndeNN
está el código hexadecimal del personaje. Simplemente puede ajustar elprintf
para cualquier estilo de salida que desee.Puede ver ese programa en acción aquí, donde:
fuente
tr '[:cntrl:] '.'
es mejor. Y debería estar\000-\010\013\014\016-\037\177-\377'
en su sintaxis tr.tr '[\000-\010\013\014\016-\037\177-\377]' '_'
viable, el cntrl no es adecuado para mi caso.cat
paso entubandogrep --text
entr
lugar de viceversa. Esto también le permite grep de varios archivos y mantener la referencia del nombre del archivo en la salida.Puede utilizar "cadenas" para extraer cadenas de un archivo binario, por ejemplo
fuente
Puede forzar a grep a mirar archivos binarios con:
Es posible que también desee agregar
-o
(--only-matching
) para no obtener toneladas de galimatías binarias que arruinarán su terminal.fuente
--only-matching
, y su expresión regular no coincide con datos binarios arbitrarios, no tendrá ningún problema.A partir de Grep 2.21, los archivos binarios se tratan de manera diferente :
Entonces, lo que sucede ahora es que con los datos binarios, todos los bytes que no son de texto (incluidas las nuevas líneas) se tratan como terminadores de línea. Si desea cambiar este comportamiento, puede:
utilizar
--text
. Esto asegurará que solo las nuevas líneas sean terminadores de líneautilizar
--null-data
. Esto asegurará que solo los bytes nulos sean terminadores de líneafuente
grep -a forzará a grep a buscar y generar desde un archivo que grep piensa que es binario. grep -a re test.log
fuente
Como ya dijo James Selvakumar,
grep -a
funciona. -a o --text obliga a Grep a manejar el flujo de entrada como texto. Ver página de manual http://unixhelp.ed.ac.uk/CGI/man-cgi?greptratar
fuente
tu puedes hacer
esto convertirá la salida como una cadena legible a grep.
fuente
También puede probar la herramienta Word Extractor . Word Extractor se puede usar con cualquier archivo en su computadora para separar las cadenas que contienen texto / palabras humanas del código binario (aplicaciones exe, DLL).
fuente
Esto es lo que usé en un sistema que no tenía el comando "strings" instalado
Esto imprime el texto y elimina los caracteres no imprimibles de una sola vez, a diferencia de "cat -v filename", que requiere un procesamiento posterior para eliminar elementos no deseados. Tenga en cuenta que algunos de los datos binarios pueden imprimirse, por lo que aún obtendrá algunos galimatías entre las cosas buenas. Creo que las cuerdas también eliminan este galimatías si puedes usar eso.
fuente