Ich habe ein 30-GB-Festplatten-Image einer verteilten Partition (glaube ich dd if=/dev/sda1 of=diskimage
), von der ich einige Textdateien wiederherstellen muss. Daten-Carving-Tools foremost
funktionieren zum Beispiel nur mit Dateien mit klar definierten Kopfzeilen, also nicht mit einfachen Textdateien. Deshalb habe ich mich auf meinen guten Freund verlassen strings
.
strings diskimage > diskstrings.txt
produzierte eine 3 GB große Textdatei, die eine Reihe von Zeichenfolgen enthielt, meistens nutzloses Zeug, gemischt mit dem Text, den ich eigentlich haben möchte.
Der größte Teil der Kruft besteht aus langen, ungebrochenen Kauderwelschfäden. Das Material, an dem ich interessiert bin, ist garantiert kleiner als 16 KB, also werde ich die Datei nach Zeilenlänge filtern. Hier ist das Python-Skript, mit dem ich das mache:
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()
Dies funktioniert, aber zum späteren Nachschlagen: Gibt es magische einzeilige Beschwörungsformeln (think awk
, sed
), die eine Datei nach Zeilenlänge filtern würden?
awk 'length($0) < 16384' file > output
folgt geschrieben werden : Die Standardaktion besteht darin, die Zeile zu drucken.Dies ähnelt der Antwort von Ansgar, ist jedoch in meinen Tests etwas schneller:
Es ist die gleiche Geschwindigkeit wie die anderen awk Antworten. Es basiert auf dem Implizit
print
eines wahren Ausdrucks, braucht sich jedoch nicht die Zeit zu nehmen, um die Zeile wie bei Ansgar zu teilen.Beachten Sie, dass AWK Ihnen eine
if
kostenlose gibt. Der obige Befehl entspricht:Es gibt keine expliziten
if
(oder die umgebenden geschweiften Klammern) wie in einigen anderen Antworten.Hier ist eine Möglichkeit, dies zu tun
sed
:oder:
die jede Zeile löschen, die 16384 (oder mehr) Zeichen enthält.
Der Vollständigkeit halber verwenden Sie die folgenden Methoden
sed
, um Zeilen zu speichern, die länger als Ihr Schwellenwert sind:quelle
Sie können
awk
wie folgt vorgehen :Dadurch werden die Zeilen gedruckt, die kürzer als 16 KB (16 * 1024) sind.
Sie können
grep
auch verwenden:Dadurch werden die Zeilen mit maximal 16 KByte gedruckt.
quelle
grep
bin mir nicht sicher, ob das eine gute Idee ist - es ist zwar ein einfacher regulärer Ausdruck, aber rechenintensiver alsawk
. "Ein Mann mit einem Problem sagt:" Ich verwende reguläre Ausdrücke! "Jetzt hat er zwei Probleme." ;)awk
.Nicht wirklich anders als die bereits gegebenen Antworten, aber noch kürzer:
quelle