Как grep текстовый файл, который содержит некоторые двоичные данные?



возвращает команда grep




Binary file test.log matches




echo    "line1 re x00rnline2rnline3 rern" > test.log  # in zsh
echo -e "line1 re x00rnline2rnline3 rern" > test.log # in bash
grep re test.log


Я хочу, чтобы результат показал line1 и line3 (всего две строки).



можно использовать tr преобразование непечатаемых данных в читаемые данные, чтобы grep снова работал?

501   10  

10 ответов:

вы можете запустить файл данных через cat -v, электронной.г

$ cat -v tmp/test.log | grep re
line1 re ^@^M
line3 re^M

который затем может быть дополнительно обработан для удаления мусора; это наиболее аналогично вашему запросу об использовании tr для задачи.

один из способов-просто обрабатывать двоичные файлы как текст в любом случае, с grep --text но это вполне может привести к двоичной информации на ваш терминал. Это не очень хорошая идея, если вы используете терминал, который интерпретирует выходной поток (например, VT/DEC или многие другие).

кроме того, вы можете отправить свой файл через tr С помощью следующей команды:

tr '[0-13-77-7]' '.' <test.log | grep whatever

это изменит что-нибудь меньше, чем пробел (кроме новой строки) и ничего больше, чем 126, в . характер, оставляя только печатные.


если вы хотите, чтобы каждый "незаконный" символ был заменен другим, вы можете использовать что-то вроде следующей программы C, классический стандартный входной фильтр:

#include<stdio.h>
int main (void) {
    int ch;
    while ((ch = getchar()) != EOF) {
        if ((ch == '\n') || ((ch >= ' ') && (ch <= '~'))) {
            putchar (ch);
        } else {
            printf ("{{%02x}}", ch);
        }
    }
    return 0;
}

это даст вам {{NN}}, где NN - это шестнадцатеричный код символа. Вы можете просто настроить printf для любого типа выхода.

вы можете увидеть эту программу в действии здесь, где это:

pax$ printf 'Hello,\tBob\nGoodbye, Bob\n' | ./filterProg
Hello,{{09}}Bob
Goodbye, Bob
grep -a

Это не может быть проще.

вы можете использовать "строки" для извлечения строк из двоичного файла, например

strings binary.file | grep foo

вы можете заставить grep смотреть на двоичные файлы с помощью:

grep --binary-files=text

вы также можете добавить -o (--only-matching) Так что вы не получите тонны бинарных бред, что Борк вашего терминала.

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

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

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

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

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

Как уже сказал Джеймс Селвакумар,grep -a делает трюк. - A или --text заставляет Grep обрабатывать входной поток как текст. Смотрите Manpage http://unixhelp.ed.ac.uk/CGI/man-cgi?grep

попробовать

cat test.log | grep -a somestring

можно сделать

strings test.log | grep -i

это будет конвертировать дать выход как читается строка в грэп.

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

Comments

    Ничего не найдено.