Lệnh Linux để lấy một phạm vi byte từ một tệp


15

Tôi biết điều đó headtailcó thể có -ctùy chọn để chỉ định một byte bù. Tôi đang tìm cách trích xuất hiệu quả một dải byte từ một tệp nhật ký lớn.

Câu trả lời:


17

DareDevil của các lệnh Unix, ddđể giải cứu!

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

Điều đó sẽ bắt đầu từ byte 200 và hiển thị 100 byte tiếp theo, hay nói cách khác, byte 200-300. ibscó nghĩa là dd chỉ đọc một byte mỗi lần thay vì 512 byte mặc định, nhưng vẫn ghi ra trong các đoạn 512 byte mặc định. Đi và xem nếu ibslàm hại hiệu suất, tôi hy vọng không.


Đối với một tệp có 782090815 byte, tôi đã nhận được những khoảng thời gian sau: 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

Nếu sự quan tâm của bạn là các byte, sẽ odđược quan tâm nhiều hơn.

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

Vì vậy, để đọc 16 byte bắt đầu từ byte 1024 và xuất ra ascii

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

4

Bạn có thể sử dụng dd if=logfile of=pieceoflogfile skip=startingblock count=#ofblocks(có thể với bs=1để có được các khối một byte, nếu không, nó sử dụng các khối 512 byte). Dù vậy, không chắc là nó hiệu quả đến mức nào để bảo nó viết một byte mỗi lần.


Vâng, nếu lo ngại về hiệu quả - 2 dd's có thể ống-xích với nhau (ngày 1 có thể cắt mảnh chất béo và thứ 2 sẽ làm việc tốt trên các đường ống, không đĩa), nhưng ddcó không chỉ bsnhưng riêng biệt ibsobslà tốt, vậy tại ít nhất nó có thể xuất ra với khối lớn hơn đọc.
poige

1

Giả sử tệp không quá lớn (ví dụ: vài GB hoặc hơn), việc chuyển từ một đến kế tiếp sẽ hiệu quả như bạn sẽ nhận được, không cần viết chương trình của riêng bạn để làm như vậy.

head ... file | tail ...

(Hoặc cách khác xung quanh. Bất cứ điều gì.)


1
đuôi nên đi trước cho phần bù lớn, nếu không phần đầu của đầu ra bị loại bỏ.
proski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.