Làm cách nào để grep qua các tệp nhị phân trông giống như văn bản?


76

Tôi có các tệp nhị phân phải là văn bản (chúng là các bản ghi được xuất), nhưng tôi không thể mở nó với ít hơn (trông xấu xí - nó trông giống như một tệp nhị phân). Tôi thấy rằng tôi có thể mở nó bằng vi và tôi có thể mở nó (bạn sẽ thấy nhật ký thực tế), nhưng điều tôi thực sự muốn làm là grep qua chúng (mà không cần phải mở từng cái bằng vi và sau đó thực hiện một tìm kiếm). Có cách nào để tôi làm điều đó?



11
Bạn đã thử grep -achưa
lượng tử

Câu trả lời:


85

grepDù sao bạn cũng có thể sử dụng để tìm kiếm thông qua tệp - nó không thực sự quan tâm liệu tệp đầu vào có thực sự là văn bản hay không. Từ 'người đàn ông grep':

    -a, --text
          Process a binary file as if it were text; this is equivalent to the --binary-files=text option.

   --binary-files=TYPE
          If  the  first few bytes of a file indicate that the file contains binary data, assume that the file is
          of type TYPE.  By default, TYPE is binary, and grep normally outputs either a one-line  message  saying
          that a binary file matches, or no message if there is no match.  If TYPE is without-match, grep assumes
          that a binary file does not match; this is equivalent  to  the  -I  option.   If  TYPE  is  text,  grep
          processes  a  binary  file  as  if  it  were  text; this is equivalent to the -a option.  Warning: grep
          --binary-files=text might output binary garbage, which can have nasty side effects if the output  is  a
          terminal and if the terminal driver interprets some of it as commands.

Vui lòng đánh dấu các từ thận trọng ở cuối đoạn thứ hai. Bạn có thể muốn chuyển hướng kết quả từ grep vào một tệp mới và kiểm tra điều này với vi / less.


grep không thực sự hoạt động. thử grep trên thiết bị lưu trữ. nó sẽ hết bộ nhớ nó có một cơ chế đệm nội bộ bị hỏng phụ thuộc vào các dòng có độ dài hợp lý.
user239558

41

Đưa nó qua strings, nó sẽ loại bỏ tất cả các mã nhị phân chỉ để lại văn bản.


stringshình như không hiểu utf-8 là văn bản.
Javier

6

Tôi nghĩ rằng đây là câu trả lời tốt nhất ở đây. Thật là khó chịu khi thấy các triển khai tìm kiếm nhị phân xấu như ở đây Commandlinefu.com/commands/matching/grep-binary/ , nơi mà việc thoát bằng cách \xkhông thực sự hoạt động như ở đây grep -P "\x05\x00\xc0" mybinaryfile.
Léo Léopold Hertz

Tôi chạy bgrep "fafafafa" test_27.6.2015.bin |lessnhưng nhận test_27.6.2015.bin: 00005ee4 . Tôi sẽ giả sử có được fafafafa , vì tôi đã tìm kiếm này. Không có hướng dẫn sử dụng ở người đàn ông. Bất cứ ý tưởng tại sao một đầu ra như vậy?
Léo Léopold Hertz

Tôi đã mở một chủ đề mới về chức năng của bgrep tại đây stackoverflow.com/q/31135561/54964
Léo Léopold Hertz

sự khác biệt là grep -agì?
rubo77

Thật không may, bash: bgrep: command not found...No package bgrep available.

5

Bạn có thể sử dụng ba lệnh sau:

  1. grep -a <sth> file.txt

  2. cat -v file.txt | grep <sth>

  3. cat file.txt | tr '[\000-\011\013-\037\177-\377]' '.' | grep <sth>


Tr dường như không hoạt động trên hộp solaris 10 của tôi. Kiểm tra đơn giản: echo -e 'x \ ty' | tr '[\ 000- \ 011 \ 013- \ 037 \ 177- \ 377]' '.' không dịch tab.
dùng55570

1

Bắt đầu với Grep 2.21, các tệp nhị phân được xử lý khác nhau :

Khi tìm kiếm dữ liệu nhị phân, grep bây giờ có thể coi các byte không phải là văn bản như là các đầu cuối dòng. Điều này có thể tăng hiệu suất đáng kể.

Vì vậy, những gì xảy ra bây giờ là với dữ liệu nhị phân, tất cả các byte không phải văn bản (bao gồm cả dòng mới) được coi là dấu kết thúc dòng. Nếu bạn muốn thay đổi hành vi này, bạn có thể:

  • sử dụng --text. Điều này sẽ đảm bảo rằng chỉ có các dòng mới là dấu kết thúc dòng

  • sử dụng --null-data. Điều này sẽ đảm bảo rằng chỉ các byte null là các đầu cuối dòng

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.