Як я переглядаю бінарні файли, схожі на текст?


76

У мене є бінарні файли, які мають бути текстовими (вони експортують журнали), але я не можу відкрити їх менше (це виглядає некрасиво - схоже на двійковий файл). Я виявив, що я можу відкрити його за допомогою vi і вмію котити його (ви побачите фактичні журнали), але те, що я дуже хотів би зробити, це проглядати їх (не потрібно відкривати кожного з vi, а потім виконувати пошук). Чи є для мене спосіб це зробити?



11
Ви пробували grep -a?
кванта

Відповіді:


85

Ви можете grepбудь-яким чином використовувати для пошуку файлу - це не дуже важливо, чи вхідний файл насправді є текстовим чи ні. Від '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.

Будь ласка, позначте слова обережності в кінці другого абзацу. Можливо, ви хочете перенаправити результати з grep в новий файл і вивчити це з допомогою vi / less.


греп насправді не працює. спробуйте grep на пристрої зберігання даних. у неї закінчиться пам'ять. у нього порушений внутрішній буферний механізм, що залежить від ліній розумної довжини.
user239558

41

Проведіть його наскрізь strings, що викреслить весь двійковий код, залишивши лише текст.


stringsмабуть, не розуміє utf-8 - це текст.
Хав'єр

6

Дайте bgrepспробувати. ( оригінальний випуск / новіша вилка )


Я думаю, що це найкраща відповідь тут. Настільки прикро бачити погані реалізації бінарного пошуку, як тут commandlinefu.com/commands/matching/grep-binary/…, де втеча \xне справді працює, як тут grep -P "\x05\x00\xc0" mybinaryfile.
Лео Леопольд Герц 준영

Я біжу, bgrep "fafafafa" test_27.6.2015.bin |lessале отримую тест_27.6.2015.bin: 00005ee4 . Я б припустив отримати фафафафа , оскільки я шукав це. Ніякого посібника в людині. Будь-яка ідея, чому такий вихід?
Лео Леопольд Герц 준영

Я відкрив нову тему про функціонування bgrep тут stackoverflow.com/q/31135561/54964
Léo Леопольда Герца 준영

в чому різниця grep -a?
rubo77

На жаль, bash: bgrep: command not found...і No package bgrep available.

5

Ви можете використовувати ці три команди:

  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, здається, не працює на моїй коробці solaris 10. Простий тест: echo -e 'x \ ty' | tr '[\ 000- \ 011 \ 013- \ 037 \ 177- \ 377]' '.' не перекладає вкладку.
користувач55570

1

Починаючи з Grep 2.21, бінарні файли трактуються по-різному :

Під час пошуку бінарних даних grep тепер може розглядати нетекстові байти як термінатори рядків. Це може значно підвищити продуктивність.

Отже, що відбувається зараз - це те, що з двійковими даними всі нетекстові байти (включаючи нові рядки) трактуються як термінатори рядків. Якщо ви хочете змінити цю поведінку, ви можете:

  • використання --text. Це забезпечить, що лише нові рядки є термінаторами ліній

  • використання --null-data. Це забезпечить, що лише нульові байти є термінаторами рядків

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.