Bir dosyadan bir bayt aralığı almak için Linux komutu


15

Bunu biliyorum headve bir bayt uzaklığı belirtme seçeneği tailalabilir -c. Verimli bir bayt aralığı büyük bir günlük dosyasından ayıklamak için bir yol arıyorum.

Yanıtlar:


17

ddKurtarmaya Unix'in DareDevil komutları !

dd if=yourfile ibs=1 skip=200 count=100

Bu, bayt 200'den başlar ve 100 sonraki bayt veya başka bir deyişle, 200-300 bayt gösterir. ibsdd, varsayılan 512 bayt yerine her seferinde yalnızca bir bayt okur, ancak yine de varsayılan 512 bayt yığınlarında yazar. Git ve ibsperformansa zarar verip vermediğini gör , umarım olmaz.


782090815 baytlık bir dosya için şu süreleri aldım: time dd if=file.txt | wc -l= 00: 00: 03s. time dd if=file.txt ibs=1 count=782090815 | wc -l= 9:05:19
Danilo Souza Morães

11

İlginiz baytta ise, oddaha ilgi çeker.

-j, --skip-bytes=bytes
-N, --read-bytes=bytes

Yani bayt 1024'ten başlayan 16 baytı okumak ve ASCII'den çıktı almak için

od -j 1024 -N 16 -a /bin/sh

4

Kullanabilirsiniz dd if=logfile of=pieceoflogfile skip=startingblock count=#ofblocks(muhtemelen bs=1bir baytlık bloklar almak için ile , aksi takdirde 512 baytlık bloklar kullanır). Yine de bir seferde bir bayt yazmanın ne kadar verimli olduğundan emin değilim.


Verimlilikle ilgili endişe varsa - dd2'ler birbirine zincirleme bağlanabilir (1'inci yağ parçasını kesebilir ve 2'ini disk değil, boru üzerinde iyi iş yapar), ancak ddsadece bsayrı değil ibsve obsaynı zamanda, en azından okumaktan daha büyük bloklarla çıktı olabilir.
poige

1

Dosyanın aşırı büyük olmadığı varsayılırsa (örneğin, birkaç GB veya daha fazla), birinden diğerine borulama yapabileceğiniz kadar verimlidir, bunu yapmak için kendi programınızı yazmazsınız.

head ... file | tail ...

(Ya da başka türlü. Hangisi?)


1
kuyruk büyük ofsetler için önce gitmelidir, aksi takdirde kafa çıkışının başlangıcı atılır.
proski
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.