Mam obraz dysku 30 GB zepsutej partycji (pomyśl dd if=/dev/sda1 of=diskimage
), z którego muszę odzyskać niektóre pliki tekstowe. Narzędzia do rzeźbienia danych, takie jak foremost
tylko pliki z dobrze zdefiniowanymi nagłówkami, tj. Nie zwykłe pliki tekstowe, spoczęły na moim dobrym przyjacielu strings
.
strings diskimage > diskstrings.txt
stworzyłem plik tekstowy 3 GB zawierający wiązkę ciągów, głównie niepotrzebnych rzeczy, zmieszany z tekstem, którego tak naprawdę chcę.
Większość cruft to naprawdę długie, nieprzerwane ciągi bełkotu. Rzeczy, które mnie interesują, mają na pewno mniej niż 16 KB, więc zamierzam filtrować plik według długości linii. Oto skrypt Pythona, którego używam do tego:
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()
Działa to, ale do wglądu w przyszłości: Czy są jakieś magiczne inkantacje jednowierszowe (pomyśl awk
, sed
), które filtrowałyby plik według długości linii?
awk 'length($0) < 16384' file > output
, ponieważ domyślną czynnością jest wydrukowanie linii.Jest to podobne do odpowiedzi Ansgara, ale nieco szybsze w moich testach:
Jest taka sama prędkość jak inne odpowiedzi awk. Opiera się na domniemanym
print
prawdziwym wyrażeniu, ale nie musi poświęcać czasu na podzielenie linii, tak jak robi to Ansgar.Pamiętaj, że AWK daje ci
if
za darmo. Powyższe polecenie jest równoważne z:Nie ma wyraźnego
if
(lub otaczającego go zestawu nawiasów klamrowych), jak w niektórych innych odpowiedziach.Oto sposób na to
sed
:lub:
które usuwają dowolny wiersz zawierający 16384 (lub więcej) znaków.
Dla kompletności, oto jak chcesz
sed
zapisać linie dłuższe niż próg:źródło
Możesz na
awk
przykład:Spowoduje to wydrukowanie linii dłuższych niż 16 000 znaków (16 * 1024).
Możesz użyć
grep
również:Spowoduje to wydrukowanie wierszy maksymalnie 16 000 znaków.
źródło
grep
to dobry pomysł - to proste wyrażenie regularne, ale bardziej kosztowne obliczeniowo niżawk
. „Mężczyzna z problemem mówi:„ Użyję wyrażeń regularnych! ”Teraz ma dwa problemy.” ;)awk
.Nie różni się tak naprawdę od już udzielonych odpowiedzi, ale wciąż jest krótszy:
źródło