Vaciar un archivo sin que grep lo trate posteriormente como un archivo binario

Vaciar un archivo sin que grep lo trate posteriormente como un archivo binario

Actualmente tengo netcatuna salida de tubería en teela que se escribe en output.txt con

nc -l -k -p 9100 | tee output.txt

Quiero monitorear esta salida, así que la estoy viendo a tail -f | egrep -i 'regex'través de PuTTY para ver solo los bits relevantes.

De vez en cuando quiero borrar el archivo de salida. Surge el problema de que si lo hago > output.txty lo intento nuevamente, tail -f | egrep ...no obtengo ningún resultado. Si reviso el archivo, no obtengo coincidencias, a pesar de saber que haydeberíaser coincidencias (como cat output.txtescupe el archivo correctamente)

mitch@quartz:~$ grep output.txt -e 'regex'
Binary file output.txt matches

Mientras que el mismo comando en salida.txtantesvaciarlo funciona bien.

Básicamente: >hace greppensar que mi archivo es un archivo binario y no buscará correctamente. ¿Existe una mejor manera de borrar el archivo?

Respuesta1

Si el único problema es que greplo trata como binario, indique grepque lo busque de todos modos:

$ head /bin/bash > out
$ echo "test" >> out 
$ grep test out 
Binary file out matches
$ grep -a test out 
test

De man grep:

   -a, --text
          Process  a binary file as if it were text; this is equivalent to
          the --binary-files=text option.

Respuesta2

Podría responder a tu pregunta, así que aquí están los resultados de algunas pruebas que acabo de realizar:

$ > output.txt
$ file output.txt
output.txt: empty

$ echo "" > output.txt
$ file output.txt
output.txt: very short file (no magic)

$ echo " " > output.txt
$ file output.txt
output.txt : ASCII text

Como puede ver, el archivo no está categorizado de la misma manera según lo que realmente"poner" en él cuando intenta borrarlo. Por lo tanto, es posible que desee utilizar una cadena vacía en lugar de nada.

Respuesta3

>hace que grep piense que el archivo es binario porque es binario. La cuestión es que vaciaste el archivo, pero no detuviste el programa que lo estaba llenando.

>output.txtcrea output.txtsi no existe y lo trunca a longitud cero si existe.

En el momento en que ejecuta >output.txt, hay un teeproceso que tiene el archivo abierto. Truncar el archivo no afecta la posición en la que teese escribe. digamos que había escritonortebytes antes del truncamiento. La próxima vez que teeescriba después del truncamiento, comenzará a escribir en la posiciónnorte. Se permite escribir en una posición más allá del final actual de un archivo y llena el comienzo del archivo con bytes nulos.¹ Eso es lo que sucedió aquí.

Grep ve un archivo que comienza con algunos bytes nulos. Informa correctamente el archivo como binario.

Puedes decirle a GNU grep que trate el archivo como texto llamando a grep -a. Buscará en todo el archivo, incluidos los bytes nulos (que no coinciden, por lo que no afectan el resultado a menos que haya una coincidencia en la primera línea, pero pueden causar una desaceleración si hay muchos).

Una mejor solución es indicar teeque se escriba siempre al final actual del archivo. Afortunadamente (comoStéphane Chazelas comentó), hay una opción para eso: tee -a(presente en todos los sistemas compatibles con POSIX). Primero deberá truncar el archivo.

>output.txt
nc -l -k -p 9100 | tee -a output.txt

¹ La mayoría de los sistemas de archivos permiten que bloques que consistirían enteramente en bytes nulos permanezcan sin asignar. Este método especializado de compresión se llama hacer unarchivo escaso.

información relacionada