Вопрос: Как выполнить grep через двоичные файлы, которые выглядят как текст?


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


76
2017-11-05 15:03


Источник


serverfault.com/questions/51477/... - quanta
Ты пробовал grep -a? - quanta
stackoverflow.com/questions/9988379/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


Ответы:


Вы можете использовать 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.


84
2017-11-05 15:48



grep не работает. попробуйте grep на устройстве хранения. у него закончится память. он имеет поврежденный внутренний буферный механизм, который зависит от разумных линий длины. - user239558


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


41
2017-11-05 15:09



Отличная идея, спасибо :) [не OP] - Karel Bílek
strings видимо, не понимает utf-8 - это текст. - Javier


Дайте bgrep попробуйте. (оригинальный релиз / более поздняя версия)


6
2017-11-05 16:07



Я думаю, что это лучший ответ. Это так раздражает видеть плохие реализации бинарного поиска, как здесь commandlinefu.com/commands/matching/grep-binary/... где побег на \x на самом деле не работает grep -P "\x05\x00\xc0" mybinaryfile, - Léo Léopold Hertz 준영
я бегу bgrep "fafafafa" test_27.6.2015.bin |less но получить test_27.6.2015.bin: 00005ee4, Я бы предположил, fafafafa, так как я искал это. В человеке нет руководства. Любая идея, почему такой выход? - Léo Léopold Hertz 준영
Я открыл новую тему о функционировании bgrep здесь stackoverflow.com/q/31135561/54964 - Léo Léopold Hertz 준영
в чем разница grep -a? - rubo77
К сожалению, bash: bgrep: command not found... а также No package bgrep available, - jww


Вы можете использовать эти три команды:

  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>


5
2018-06-17 10:43



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


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

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

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

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

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


1
2017-07-18 00:19