Tengo una imagen de disco de 30 gb de una partición borked (creo dd if=/dev/sda1 of=diskimage
) de la que necesito recuperar algunos archivos de texto. Las herramientas de tallado de datos foremost
solo funcionan en archivos con encabezados bien definidos, es decir, no en archivos de texto sin formato, por lo que he recurrido a mi buen amigo strings
.
strings diskimage > diskstrings.txt
produjo un archivo de texto de 3 gb que contiene un montón de cadenas, en su mayoría cosas inútiles, mezcladas con el texto que realmente quiero.
La mayor parte de la ruina tiende a ser muy larga e ininterrumpida de galimatías. Las cosas que me interesan están garantizadas en menos de 16 kb, por lo que voy a filtrar el archivo por la longitud de la línea. Aquí está el script de Python que estoy usando para hacerlo:
infile = open ("infile.txt" ,"r");
outfile = open ("outfile.txt","w");
for line in infile:
if len(line) < 16384:
outfile.write(line)
infile.close()
outfile.close()
Esto funciona, pero para referencia futura: ¿Hay encantamientos mágicos de una sola línea (pensemos awk
, sed
) que filtrar un archivo de longitud de la línea?
awk 'length($0) < 16384' file > output
, ya que la acción predeterminada es imprimir la línea.Esto es similar a la respuesta de Ansgar, pero un poco más rápido en mis pruebas:
Es la misma velocidad que las otras respuestas awk. Se basa en lo implícito
print
de una expresión verdadera, pero no necesita tomarse el tiempo para dividir la línea como lo hace Ansgar.Tenga en cuenta que AWK le ofrece
if
gratis. El comando anterior es equivalente a:No hay explícito
if
(o su conjunto circundante de llaves) como en algunas de las otras respuestas.Aquí hay una manera de hacerlo
sed
:o:
que eliminan cualquier línea que contenga 16384 (o más) caracteres.
Para completar, así es como usaría
sed
para guardar líneas más largas que su umbral:fuente
Puedes
awk
como:Esto imprimirá las líneas más largas que menos de 16K caracteres (16 * 1024).
Puedes usar
grep
también:Esto imprimirá las líneas en la mayoría de los 16K caracteres.
fuente
grep
sea una buena idea: es una expresión regular simple, sin duda, pero más costosa desde el punto de vista computacional queawk
. "Un hombre con problemas dice" ¡Usaré expresiones regulares! "Ahora tiene dos problemas". ;)awk
.No es realmente diferente de las respuestas ya dadas, pero aún más breve:
fuente