Perintah Linux untuk mengambil rentang byte dari file

15

Saya tahu itu headdan taildapat mengambil -copsi untuk menentukan byte offset. Saya mencari cara untuk secara efisien mengekstrak rentang byte dari file log besar.

Ramon
sumber

Jawaban:

17

The DareDevil dari perintah Unix, dduntuk menyelamatkan!

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

Itu akan mulai dari byte 200 dan menampilkan 100 byte berikutnya, atau dengan kata lain, byte 200-300. ibsberarti dd hanya membaca satu byte pada suatu waktu alih-alih 512 byte default, tetapi masih menulis dalam potongan 512 byte default. Pergi dan lihat apakah ibsmerusak kinerja, saya harap tidak.

Janne Pikkarainen
sumber
Untuk file 782090815 byte, saya dapat waktu ini: 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

Jika minat Anda dalam byte, akan odlebih menarik.

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

Jadi untuk membaca 16 byte mulai dari byte 1024, dan output dalam ascii

od -j 1024 -N 16 -a /bin/sh
Sirch
sumber
4

Anda dapat menggunakan dd if=logfile of=pieceoflogfile skip=startingblock count=#ofblocks(mungkin dengan bs=1untuk mendapatkan blok satu byte, jika tidak menggunakan blok 512 byte). Tidak yakin seberapa efisien untuk mengatakannya untuk menulis satu byte pada suatu waktu.

DerfK
sumber
Nah, jika yang bersangkutan mengenai efisiensi - 2 dd's dapat pipa-dirantai bersama-sama (1 mungkin memotong sepotong lemak dan ke-2 akan melakukan pekerjaan baik atas pipa, tidak disk), tetapi ddtidak hanya bstetapi terpisah ibsdan obsjuga, jadi pada Setidaknya itu bisa dihasilkan dengan blok yang lebih besar daripada membaca.
poige
1

Dengan asumsi file tersebut tidak terlalu besar (misalnya beberapa GB atau lebih), pipa dari satu ke yang berikutnya seefisien yang Anda dapatkan, singkat menulis program Anda sendiri untuk melakukannya.

head ... file | tail ...

(Atau sebaliknya. Mana pun.)

Ignacio Vazquez-Abrams
sumber
1
ekor harus pergi dulu untuk offset besar, jika tidak, output head awal akan dibuang.
proski