Bagaimana cara saya melihat file biner yang terlihat seperti teks?

76

Saya memiliki file biner yang seharusnya berupa teks (mereka diekspor log), tetapi saya tidak dapat membukanya dengan lebih sedikit (tampilannya jelek - kelihatannya seperti file biner). Saya menemukan bahwa saya bisa membukanya dengan vi dan saya bisa mengecatnya (Anda akan melihat log yang sebenarnya), tetapi apa yang benar-benar ingin saya lakukan adalah menjelajahinya (tanpa harus membuka masing-masing dengan vi dan kemudian melakukan pencarian). Apakah ada cara bagi saya untuk melakukan itu?

Robyn Smith
sumber
11
Apakah kamu sudah mencoba grep -a?
quanta
1
stackoverflow.com/questions/9988379/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

85

Anda greptetap dapat menggunakan untuk mencari melalui file - tidak terlalu peduli apakah file input benar-benar teks atau tidak. Dari 'man 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.

Harap tandai kata-kata hati-hati di akhir paragraf kedua. Anda mungkin ingin mengarahkan ulang hasil dari grep ke file baru dan memeriksanya dengan vi / kurang.

Axel Knauf
sumber
grep tidak benar-benar berfungsi. coba grep pada perangkat penyimpanan. itu akan kehabisan memori. ia memiliki mekanisme penyangga internal yang rusak yang tergantung pada garis panjang yang masuk akal.
user239558
41

Pipa melalui itu strings, yang akan menghapus semua kode biner hanya menyisakan teks.

Mike Scott
sumber
stringsrupanya tidak mengerti utf-8 adalah teks.
Javier
6

Berikan bgrepmencoba. ( rilis asli / garpu lebih baru )

kuanta
sumber
Saya pikir ini adalah jawaban terbaik di sini. Sangat menyebalkan melihat implementasi buruk dari pencarian biner seperti di sini commandlinefu.com/commands/matching/grep-binary/… di mana pelarian oleh \xtidak benar-benar berfungsi seperti di sini grep -P "\x05\x00\xc0" mybinaryfile.
Léo Léopold Hertz 준영
Saya menjalankan bgrep "fafafafa" test_27.6.2015.bin |lesstetapi mendapatkan test_27.6.2015.bin: 00005ee4 . Saya akan berasumsi mendapatkan fafafafa , karena saya sedang mencari ini. Tidak ada manual dalam manusia. Adakah yang tahu mengapa output seperti itu?
Léo Léopold Hertz 준영
Saya membuka utas baru tentang fungsi bgrep di sini stackoverflow.com/q/31135561/54964
Léo Léopold Hertz 준영
apa bedanya grep -a?
rubo77
Sayangnya, bash: bgrep: command not found...dan No package bgrep available.
5

Anda dapat menggunakan tiga perintah ini:

  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>

MLSC
sumber
tr tampaknya tidak bekerja pada kotak solaris 10 saya. Tes sederhana: echo -e 'x \ ty' | tr '[\ 000- \ 011 \ 013- \ 037 \ 177- \ 377]' '.' tidak menerjemahkan tab.
user55570
1

Dimulai dengan Grep 2.21, file biner diperlakukan secara berbeda :

Saat mencari data biner, grep sekarang dapat memperlakukan byte non-teks sebagai terminator baris. Ini dapat meningkatkan kinerja secara signifikan.

Jadi yang terjadi sekarang adalah bahwa dengan data biner, semua byte non-teks (termasuk baris baru) diperlakukan sebagai terminator garis. Jika Anda ingin mengubah perilaku ini, Anda dapat:

  • gunakan --text. Ini akan memastikan bahwa hanya baris baru yang merupakan terminator baris

  • gunakan --null-data. Ini akan memastikan bahwa hanya byte nol yang merupakan terminator baris

Steven Penny
sumber