Как 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 снова работал?
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
вы можете использовать "строки" для извлечения строк из двоичного файла, например
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