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


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 не очень работает. попробуйте grep на устройстве хранения. это исчерпает память. у него сломан механизм внутренней буферизации, который зависит от разумной длины строк.
user239558

41

Пройдите через него strings, чтобы удалить весь двоичный код, оставив только текст.


stringsвидимо не понимает utf-8 это текст.
Хавьер

6

Я думаю, что это лучший ответ здесь. Это так раздражает видеть плохие реализации бинарного поиска, такие как здесь 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>


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

1

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

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.