Tôi đang sử dụng grep / sed để phân tích một tệp nhị phân lớn chứa đầy null cho một số dữ liệu cụ thể. Đây là trong một môi trường windows sử dụng gnuwin32.
Giả sử tôi có một số để trả về một số dữ liệu từ tệp nhị phân trông như thế này (biểu diễn hex):
42 9D E1 0A 01 FF FF FF FF FF FF FF 7F 00 FE FF FF 0A 01 E1 0A 01 C0 0B 00 4D 00
00 9C E1 0A 01 2C 41 38 B4 15 FB 49 00 4D 00 41 00 48 00 4F 00 53 00 54 00 31 00
32 00 33 00 2E 00 73 00 75 00 62 00 2E 00 64 00 6F 00 6D 00 61 00 69 00 6E 00 2E
00 73 00 74 00 61 00 2E 00 6F 00 72 00 67 00 2E 00 61 00 75
Nhưng chỉ phù hợp với phần này ở trên:
49 00 4D 00 41 00 48 00 4F 00 53 00 54 00 31 00 32 00 33
Làm thế nào chính xác tôi sẽ đi về nó bằng cách sử dụng grep và / hoặc sed? Sự hiện diện của null thực hiện một số điều xấu đối với grep, đặc biệt là vì tôi thực sự cần phải trả lại dữ liệu như một phần của trình phân tích tệp tự động.
Các grep dưới đây đến gần để làm những gì tôi muốn:
grep -Prino ".{0,100}I\000M\000A\000H\000O\000S\000T\0001\0002\0003.{0,100}" "d:\dhcp.mdb"
Tuy nhiên, nó chỉ trả về "Tệp nhị phân d: \ dhcp.mdb khớp" chứ không phải mẫu phù hợp, có thể là do null. Nếu điều này có hiệu quả, một khi tôi có 100 ký tự cho cả hai bên, tôi sẽ chọn tập hợp con này cho những gì tôi cần bằng cách khớp với địa chỉ IP (theo định dạng có thể greppable) và tên miền (luôn kết thúc bằng 3 null)
Vì nó là một tệp cơ sở dữ liệu nên tôi có thể sử dụng một phương thức khác như thực sự tương tác với cơ sở dữ liệu, nhưng tôi cảm thấy tôi khá gần với phương pháp này.
Sử dụng Sed Tôi thực sự có thể thấy dữ liệu trả về từ một tệp nhỏ hơn nhiều nơi tôi đã dán một số dữ liệu có liên quan:
sed -rn "/\I\x00M\x00A\x00H\x00O\x00S\x00T\x001\x002\x003/p" "D:\cruft\Hxma.txt"
Nhưng tôi không chắc chắn làm thế nào để trả lại 100 ký tự trước và 100 ký tự sau trận đấu như trong grep ở trên và khi tôi chạy nó với tệp cơ sở dữ liệu 12 MB thì nó không trả về bất cứ điều gì (tắt tùy chọn im lặng để nó in ra không gian mẫu cho thấy nó nhận được ~ 10KB sau đó dường như bỏ cuộc)
Có ai biết làm thế nào tôi có thể tiến hành giải quyết điều này? Tôi nên thêm rằng định dạng thực của dữ liệu được trả về không quá quan trọng miễn là không có dữ liệu nào bị mất (ngoài các giá trị null, tôi hoàn toàn không cần chúng).
Nếu nó giúp, định dạng thực tế của dữ liệu văn bản tôi muốn khớp dường như là unicode 2 byte, mặc dù một số dữ liệu tôi cần trả về cùng với kết quả khớp (ví dụ: 4 byte đầu tiên là IP cuối cùng nhỏ địa chỉ) không ở trong unicode.