grep возвращает
Двоичный файл test.log соответствует
Например
echo "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log # in zsh
echo -e "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log # in bash
grep re test.log
Я хочу, чтобы в результате были показаны строки 1 и 3 (всего две строки).
Можно ли использовать tr
преобразование непечатаемых данных в читаемые данные, чтобы grep снова работал?
-e
вecho
команде?Ответы:
Вы можете запустить файл данных
cat -v
, напримеркоторый затем может быть подвергнут дальнейшей постобработке для удаления мусора; это наиболее аналогично вашему запросу об использовании
tr
для задачи.источник
man cat
говорит о-v
:-v, --show-nonprinting
use ^ and M- notation, except for LFD and TAB
set | cat -v | grep variable
grep --text
не всегда работает; он уважает CTRL + D как терминатор файла. Поэтому, если у вас есть это в вашем двоичном файле, grep выйдет раньше.Нет ничего проще.
источник
grep --text
что paxdiablo упомянул двумя годами ранееLC_ALL="C" grep -a
Один из способов - просто обрабатывать двоичные файлы как текст,
grep --text
но это вполне может привести к отправке двоичной информации на ваш терминал. Это не очень хорошая идея, если вы используете терминал, который интерпретирует выходной поток (например, VT / DEC или многие другие).Кроме того, вы можете отправить свой файл
tr
с помощью следующей команды:Это превратит все, что меньше пробела (кроме новой строки) и больше 126, в
.
символ, оставив только печатные формы.Если вы хотите, чтобы каждый "недопустимый" символ был заменен другим, вы можете использовать что-то вроде следующей программы на C, классического стандартного входного фильтра:
Это даст вам
{{NN}}
, гдеNN
находится шестнадцатеричный код символа. Вы можете просто настроитьprintf
любой стиль вывода, который хотите.Вы можете увидеть эту программу в действии здесь, где она:
источник
tr '[:cntrl:] '.'
лучше. И это должно быть\000-\010\013\014\016-\037\177-\377'
в вашем синтаксисе tr.tr '[\000-\010\013\014\016-\037\177-\377]' '_'
работоспособно, cntrl не подходит для моего случая.cat
шаг за трубопроводамиgrep --text
вtr
а не наоборот. Это также позволяет вам использовать grep для нескольких файлов и сохранять ссылку на имя файла в выводе.Вы можете использовать "строки" для извлечения строк из двоичного файла, например
источник
Вы можете заставить grep просматривать двоичные файлы с помощью:
Вы также можете захотеть добавить
-o
(--only-matching
), чтобы не получить кучу бинарной тарабарщины, которая сломает ваш терминал.источник
--only-matching
, и ваше регулярное выражение не соответствует произвольным двоичным данным, у вас не будет проблем.Начиная с Grep 2.21, двоичные файлы обрабатываются иначе :
Итак, теперь происходит то, что с двоичными данными все нетекстовые байты (включая символы новой строки) обрабатываются как терминаторы строки. Если вы хотите изменить это поведение, вы можете:
использовать
--text
. Это гарантирует, что только символы новой строки будут терминаторами строки.использовать
--null-data
. Это гарантирует, что только нулевые байты будут терминаторами строки.источник
grep -a заставит grep искать и выводить из файла, который grep считает двоичным. grep -a re test.log
источник
Как уже сказал Джеймс Селвакумар, свое
grep -a
дело. -a или --text заставляет Grep обрабатывать входной поток как текст. См. Страницу руководства http://unixhelp.ed.ac.uk/CGI/man-cgi?grepпытаться
источник
ты можешь сделать
это преобразует вывод в виде читаемой строки в grep.
источник
Вы также можете попробовать инструмент Word Extractor . Word Extractor можно использовать с любым файлом на вашем компьютере для отделения строк, содержащих человеческий текст / слова, от двоичного кода (приложения exe, библиотеки DLL).
источник
Вот что я использовал в системе, в которой не была установлена команда "strings"
Это печатает текст и удаляет непечатаемые символы одним махом, в отличие от "cat -v filename", который требует некоторой постобработки для удаления ненужных вещей. Обратите внимание, что некоторые двоичные данные могут быть распечатаны, поэтому между хорошими вещами вы все равно получите тарабарщину. Я думаю, что строки тоже убирают эту тарабарщину, если вы можете это использовать.
источник