Cómo grep para caracteres especiales NUL (^ @ ^ @ ^ @)

25

Expediente:

O000000667520994000000074720121112000000N^@^@^@ 

Usé el siguiente comando pero no funciona.

grep "^@^@^@" *

fuente

Respuestas:

50

Puede grep para cualquier carácter, incluidos los caracteres de control / no imprimibles en el modo perl-regexp (-P) por su código hexadecimal:

grep -Pa '\x00' ...
Huésped
fuente
55
Es posible que desee agregar la -aopción, de lo contrario grepcree que son datos binarios y no mostrará las líneas coincidentes.
mpy
No puedo encontrar una manera de verificar si el archivo contiene solo ASCII = 0 bytes ... grep -Pv '\x00' fileno funciona en Cygwin ...
pbies
13

^@No es un quilate ^y un signo @, es un personaje. Así es como algunos programas muestran el carácter NUL: valor ASCII 0, también conocido como \0en C.

Aquí he creado un archivo con un byte NUL. Observe que uso cat -vpara mostrar caracteres que no se imprimen.

$ cat -v blah
hello
null^@
hi
$ hexdump -C blah
00000000  68 65 6c 6c 6f 0a 6e 75  6c 6c 00 0a 68 69 0a     |hello.null..hi.|
0000000f

Grep tiene problemas para encontrar NUL ya que se usan para terminar cadenas en C. Sed, sin embargo, puede hacer el trabajo:

$ sed -n '/\x0/p' blah
null
$ sed -n '/\x0/p' blah | cat -v
null^@

En vi, en el modo de inserción, presione Ctrl- V, Ctrl- Shift- @para insertar un byte nulo.

John Kugelman
fuente
3

Si grep -Pno funciona (por ejemplo, en OS X), intente esto:

grep -E '\x00' ...
robinst
fuente
¿Estás seguro de que esto funciona? No lo hago con mi versión: grep (GNU grep) 2.14
guettli
3
Esta respuesta es para BSD grep, prueba la respuesta superior para GNU grep:grep -Pa '\x00' ...
robinst
1

En bash, puede agregar caracteres especiales cuando tenga el prefijo C-qo C-v. Entonces puedes, por ejemplo

grep 'Ctrl-vCtrl-a' file.txt

La cadena de búsqueda debe leerse como control key+ character v, seguida de control key+ character a, que busca el valor ASCII SOH (01). Desafortunadamente, esto no funciona para el personaje NUL.

Olaf Dietsche
fuente
Presumiblemente, no quiere decir que esa secuencia de caracteres deba escribirse literalmente, sino que se ingrese lógicamente en el teclado.
ligereza corre en órbita el
Sí, por supuesto. Esta es la tecla de control presionada, presione v, luego presione la tecla Control, presione a.
Olaf Dietsche
Creo que eso no está claro en tu respuesta.
Carreras de ligereza en órbita el
@LightnessRacesinOrbit Gracias por la pista. Traté de aclarar en la respuesta.
Olaf Dietsche
@JohnKugelman Gracias por la edición. Parece que debería haber estudiado la ayuda más de cerca.
Olaf Dietsche
-3

El personaje ^ @ es el personaje NUL, por lo que me temo que no se puede asimilar directamente.

Probablemente su mejor opción sea escribir un programa simple que busque esta secuencia de bytes.

Alternativamente, usted puede tratar de convertirlo en algún tipo de volcado hexadecimal ( od, xxdo algo así) y grep en la salida de la misma. Pero hablando francamente, sería difícil hacerlo bien.

rodrigo
fuente