Trả về / biến đổi sau đó trả về mẫu bằng null


0

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.

Câu trả lời:


0

Bạn đang nói với grep những gì cần tìm kiếm. Khái niệm mà bạn không biết những gì bạn vừa nói với grep để tìm kiếm là lạ và tôi không tuân theo. Mục đích của grep là tìm kiếm một mẫu mà bạn đưa ra; không tìm thấy một chuỗi mà bạn đã biết vị trí của. Tôi nghĩ bạn cần xác định rõ hơn phần nào của câu đố này.

Ngoài ra, hầu hết các cơ sở dữ liệu có các công cụ dòng lệnh. Mặc dù MS không tạo ra các công cụ tốt cho cơ sở dữ liệu của nó, có một gói được gọi là các công cụ MDB sẽ cho phép bạn thực sự sử dụng SQL để tìm kiếm DB. Đây chắc chắn là một cách tốt hơn để thực hiện những gì bạn đang cố gắng làm ở đây.

Cuối cùng, nếu bạn thực sự muốn tìm kiếm thông qua nhị phân cho các chuỗi bằng grep, tôi rất muốn đề xuất sử dụng công cụ chuỗi trong gói binutils . Điều này sẽ lọc ra ký tự không in được trước khi bạn tìm kiếm dữ liệu. Nó cũng có thể in ra các offset tiện dụng (đó là những gì bạn thường muốn trong tình huống này). Dưới đây là một ví dụ về giao diện của nó (cái này sẽ tìm kiếm nhị phân grep cho bất kỳ chuỗi nào có chứa từ 'deprecated'):

strings -a -t x /bin/grep|grep deprecated

Như bạn có thể thấy, điều này sẽ ít bị lỗi hơn nhiều. Tôi đã không kiểm tra tốc độ của điều này nhưng tôi chắc chắn rằng nó sẽ phụ thuộc rất nhiều vào nội dung nhị phân thực tế.

Cập nhật

Chỉ cần nhận ra rằng bạn đang làm việc trong Windows. Systernals tạo ra một phiên bản của chuỗi.exe khá giống với chương trình chuỗi Linux.

strings.exe -a -o C:\GnuWin\bin\grep.exe|grep deprecated

Ngoài ra, bạn có thể thử Jackcess cho một công cụ MDB dòng lệnh sẽ hoạt động với bất kỳ HĐH nào có hỗ trợ JVM.


Chỉ cần làm rõ, tôi không biết vị trí của chuỗi trước khi bắt đầu, nhưng một khi tôi có vị trí chuỗi tôi biết dữ liệu liên quan khác ở đâu liên quan đến chuỗi đó. Vì vậy, tôi khớp tên máy chủ trong tệp, sau đó lấy IP xuất hiện một vài byte trước tên máy chủ và tên miền xảy ra trực tiếp sau tên máy chủ. Điều đó nói rằng, tôi sẽ theo đuổi các công cụ MDB hoặc phương thức binutils ngay bây giờ - nếu binutils có thể cho tôi một chỉ mục, tôi hy vọng có thể kéo các ký tự không in được xung quanh chỉ mục đó (chỉ trong trường hợp có IP như 10.225.157.0 sẽ bắt đầu với số không: 009DE10A)
Bruno

Để phù hợp với bản cập nhật của bạn, ở trên nên đọc "Tôi sẽ theo đuổi phương pháp Jackcess hoặc chuỗi, hy vọng chuỗi có thể kéo xung quanh không thể in được trong trường hợp octet = 0 trong IP", v.v.
Bruno
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.