Как я пролистываю двоичные файлы, которые выглядят как текст?

76

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

Робин Смит
источник
11
Ты пробовал grep -a?
кванты
1
stackoverflow.com/questions/9988379/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

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 не очень работает. попробуйте 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но получаю test_27.6.2015.bin: 00005ee4 . Я предположил бы получить fafafafa , так как я искал это. Нет руководства в человеке. Есть идеи, почему такой вывод?
Лео Леопольд Герц 준영
Я открыл новую тему о функционировании bgrep здесь stackoverflow.com/q/31135561/54964
Лео Леопольд Херц 준영
в чем разница 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>

MLSC
источник
tr не работает на моем солярисе 10. Простой тест: echo -e 'x \ ty' | tr '[\ 000- \ 011 \ 013- \ 037 \ 177- \ 377]' '.' не переводит вкладку.
user55570
1

Начиная с Grep 2.21, двоичные файлы обрабатываются по-разному :

При поиске двоичных данных grep теперь может обрабатывать нетекстовые байты в качестве ограничителей строки. Это может значительно повысить производительность.

Итак, что происходит сейчас, так это то, что с двоичными данными все нетекстовые байты (включая переводы строк) обрабатываются как разделители строк. Если вы хотите изменить это поведение, вы можете:

  • использовать --text. Это гарантирует, что только переводы строк являются символами конца строки

  • использовать --null-data. Это гарантирует, что только нулевые байты являются ограничителями строки

Стивен Пенни
источник