2013-01-03 30 views
20

Tôi tạo các tệp dữ liệu nhị phân chỉ đơn giản là một loạt các bản ghi được nối với nhau. Mỗi bản ghi bao gồm một đầu (nhị phân) theo sau bởi dữ liệu nhị phân. Trong tiêu đề nhị phân là chuỗi ký tự ascii dài 80 ký tự. Một nơi nào đó trên đường đi, quá trình viết các tập tin của tôi có một chút sai lầm và tôi đang cố gắng để gỡ lỗi vấn đề này bằng cách kiểm tra bao lâu mỗi bản ghi thực sự là."grep" offset của chuỗi ascii từ tệp nhị phân

This có vẻ cực kỳ liên quan, nhưng tôi không hiểu perl, vì vậy tôi đã không thể nhận được câu trả lời được chấp nhận ở đó để làm việc. Câu trả lời khác chỉ tới bgrep mà tôi đã biên soạn, nhưng nó muốn tôi cho nó ăn một chuỗi hex và tôi chỉ muốn có một công cụ mà tôi có thể cho nó chuỗi ascii và nó sẽ tìm thấy nó trong dữ liệu nhị phân, in chuỗi và bù đắp byte nơi nó được tìm thấy.

Nói cách khác, tôi đang tìm kiếm một số công cụ có vai trò như thế này:

tool foobar filename 

hoặc

tool foobar < filename 

và đầu ra của nó là một cái gì đó như thế này:

foobar:10 
foobar:410 
foobar:810 
foobar:1210 
... 

ví dụ chuỗi phù hợp và một byte bù đắp trong tệp nơi trận đấu bắt đầu. Trong trường hợp ví dụ này, tôi có thể phỏng đoán rằng mỗi bản ghi dài 400 byte.

trở ngại khác:

  • khả năng tìm kiếm bằng regex là mát mẻ, nhưng tôi không cần nó cho vấn đề này
  • tập tin nhị phân của tôi là lớn (3.5GB), vì vậy tôi muốn tránh đọc toàn bộ tập tin vào bộ nhớ nếu có thể.
+0

argv! Tôi không biết tại thời điểm nào, sự thành thạo ngữ pháp tiếng Anh của tôi trượt vào trong hầm mộ. Cảm ơn bạn đã sửa lỗi đó cho tôi @Kevin – mgilson

Trả lời

23

Bạn có thể sử dụng strings cho việc này:

strings -a -t x filename | grep foobar 

Thử nghiệm với binutils GNU.

Ví dụ, nếu trong /bin/ls không --help xảy ra:

strings -a -t x /bin/ls | grep -- --help 

Output:

14938 Try `%s --help' for more information. 
162f0  --help  display this help and exit 
+3

Tôi đã kết thúc bằng cách sử dụng 'strings -a -t d filename | grep foobar' để viết đầu ra theo dạng thập phân thay vì hex. Nếu không, câu trả lời tuyệt vời mà có vẻ như nó sẽ làm việc với các hương vị khác nhau của 'grep'. – mgilson

22
grep --byte-offset --only-matching --text foobar filename 

Các --byte-offset in tùy chọn bù đắp của mỗi dòng khớp.

Tùy chọn --only-matching làm cho nó in offset cho từng trường hợp phù hợp thay vì mỗi dòng khớp.

Tùy chọn --text làm cho grep coi tệp nhị phân dưới dạng tệp văn bản.

Bạn có thể rút ngắn nó để:

grep -oba foobar filename 

Nó hoạt động trong phiên bản GNU của grep, mà đi kèm với linux theo mặc định. Nó sẽ không hoạt động trong BSD grep (đi kèm với Mac theo mặc định).

+0

Tôi đã thử điều này, tất cả những gì nó nói là: 'Các tên tập tin nhị phân trùng khớp'. Hệ thống của tôi là Ubuntu Linux và 'grep --version' cho:" GNU grep 2.5.2 " – mgilson

+1

Thử thêm tùy chọn' -a' để xử lý tệp nhị phân dưới dạng văn bản –

+0

Chúc mừng, hoạt động (với '-a'). +1. – mgilson

0

Tôi muốn thực hiện tác vụ tương tự. Mặc dù dây | grep làm việc, tôi tìm thấy gsar là công cụ rất cần thiết.

http://tjaberg.com/

Kết quả trông giống như:

>gsar.exe -bic -sfoobar filename.bin 
filename.bin: 0x34b5: AAA foobar BBB 
filename.bin: 0x56a0: foobar DDD 
filename.bin: 2 matches found 
Các vấn đề liên quan