Actualmente tengo netcat
una salida de tubería en tee
la 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.txt
y 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.txt
escupe 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 grep
pensar 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 grep
lo trata como binario, indique grep
que 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.txt
crea output.txt
si no existe y lo trunca a longitud cero si existe.
En el momento en que ejecuta >output.txt
, hay un tee
proceso que tiene el archivo abierto. Truncar el archivo no afecta la posición en la que tee
se escribe. digamos que había escritonortebytes antes del truncamiento. La próxima vez que tee
escriba 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 tee
que 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.