Saya memiliki gambar disk 30GB dari partisi borked (berpikir dd if=/dev/sda1 of=diskimage
) bahwa saya perlu memulihkan beberapa file teks. Alat pahat data seperti foremost
hanya bekerja pada file dengan header yang terdefinisi dengan baik, yaitu bukan file teks biasa, jadi saya kembali ke teman baik saya strings
.
strings diskimage > diskstrings.txt
menghasilkan file teks 3gb yang berisi banyak string, sebagian besar barang tidak berguna, dicampur dengan teks yang sebenarnya saya inginkan.
Sebagian besar cruft cenderung sangat panjang, string omong kosong yang tak terputus. Barang-barang yang saya minati dijamin kurang dari 16kb, jadi saya akan memfilter file menurut panjang baris. Inilah skrip Python yang saya gunakan untuk melakukannya:
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()
Ini berfungsi, tetapi untuk referensi di masa mendatang: Apakah ada mantra satu baris ajaib (berpikir awk
, sed
) yang akan memfilter file berdasarkan panjang baris?
awk 'length($0) < 16384' file > output
, karena tindakan default adalah mencetak baris.Ini mirip dengan jawaban Ansgar, tetapi sedikit lebih cepat dalam pengujian saya:
Ini kecepatan yang sama dengan jawaban awk lainnya. Itu bergantung pada implisit
print
ekspresi yang sebenarnya, tetapi tidak perlu meluangkan waktu untuk membagi garis seperti yang dilakukan Ansgar.Perhatikan bahwa AWK memberi Anda secara
if
gratis. Perintah di atas setara dengan:Tidak ada yang eksplisit
if
(atau sekumpulan kurung kurawal di sekitarnya) seperti pada beberapa jawaban lainnya.Ini cara untuk melakukannya
sed
:atau:
yang menghapus baris apa pun yang berisi 16384 (atau lebih) karakter.
Untuk kelengkapan, inilah cara yang akan Anda gunakan
sed
untuk menyimpan garis lebih lama dari ambang Anda:sumber
Anda bisa
awk
seperti:Ini akan mencetak garis yang lebih pendek dari 16K karakter (16 * 1024).
Anda
grep
juga dapat menggunakan :Ini akan mencetak garis paling banyak 16 ribu karakter.
sumber
grep
itu ide yang bagus - itu adalah regexp sederhana, tentu saja, tetapi lebih mahal dari komputasiawk
. "Seorang pria bermasalah mengatakan," Aku akan menggunakan ekspresi reguler! "Sekarang dia memiliki dua masalah." ;)awk
.Tidak benar-benar berbeda dari jawaban yang sudah diberikan, tetapi masih lebih pendek:
sumber