J'ai une image disque de 30 Go d'une partition borked (pensez dd if=/dev/sda1 of=diskimage
) dont j'ai besoin pour récupérer des fichiers texte. Les outils de gravure de données comme foremost
ne fonctionnent que sur des fichiers avec des en-têtes bien définis, c'est-à-dire pas des fichiers de texte brut, donc je suis tombé sur mon bon ami strings
.
strings diskimage > diskstrings.txt
produit un fichier texte de 3 Go contenant un tas de chaînes, principalement des trucs inutiles, mélangé avec le texte que je veux réellement.
La plus grande partie de la cruauté a tendance à être de très longues chaînes de charabia ininterrompues. Ce qui m'intéresse est garanti de moins de 16 Ko, donc je vais filtrer le fichier par longueur de ligne. Voici le script Python que j'utilise pour le faire:
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()
Cela fonctionne, mais pour référence future: existe-t-il des incantations magiques sur une ligne (pensez awk
-vous sed
) qui filtreraient un fichier par longueur de ligne?
awk 'length($0) < 16384' file > output
, car l'action par défaut est d'imprimer la ligne.Ceci est similaire à la réponse d'Ansgar, mais légèrement plus rapide dans mes tests:
C'est la même vitesse que les autres réponses awk. Il repose sur l'implicite
print
d'une véritable expression, mais n'a pas besoin de prendre le temps de diviser la ligne comme le fait Ansgar.Notez qu'AWK vous offre un
if
gratuitement. La commande ci-dessus équivaut à:Il n'y a pas explicite
if
(ou son ensemble d'accolades bouclés) comme dans certaines des autres réponses.Voici une façon de le faire en
sed
:ou:
qui supprime toute ligne contenant 16384 (ou plus) caractères.
Pour être complet, voici comment vous utiliseriez
sed
pour enregistrer des lignes plus longues que votre seuil:la source
Vous pouvez
awk
par exemple:Cela imprimera les lignes plus longues que 16K caractères (16 * 1024).
Vous pouvez
grep
également utiliser :Cela imprimera les lignes au plus 16K caractères.
la source
grep
si c'est une bonne idée - c'est une simple expression rationnelle, bien sûr, mais plus cher en calcul queawk
. "Un homme avec un problème dit" je vais utiliser des expressions régulières! "Maintenant, il a deux problèmes." ;)awk
.Pas vraiment différent des réponses déjà données, mais plus court encore:
la source