grep возвращает «Двоичные совпадения файла (стандартный ввод)» при попытке найти строковый шаблон в файле

71

Я на Ubuntu и я набрал, cat .bash_history | grep gitи он вернулся

Двоичный файл (стандартный ввод) соответствует

Мой bash_historyсуществует, и в нем много строк, начинающихся с git.

Что вызвало отображение этой ошибки и как я могу ее исправить?

answerSeeker
источник
Какой вывод file .bash_history( file ~/.bash_history)?
Heemayl
выходной.bash_history: data
answerSeeker
по какой-то причине это происходило с моими логами apache. спасибо за вопросы
Billynoah
очень тесно связаны: unix.stackexchange.com/q/19907/5510
Тревор Бойд Смит

Ответы:

11

Предположительно файл .bash_historyначинается с нетекстовых данных, следовательно grep, обрабатывает файл как двоичный файл. Это подтверждается file .bash_historyвыводом:

.bash_history: data 

Вы можете прочитать несколько байтов с начала, чтобы иметь соответствующее представление:

head -c1K .bash_history 

Здесь я читаю первый 1 КиБ.

Вы можете направить STDOUT к hexdump/ odили подобному.


Как примечание, grepпринимает имя файла (ов) в качестве аргумента, поэтому catздесь бесполезно; просто сделать:

grep git .bash_history
heemayl
источник
Я все еще не знаю, как решить проблему grep, head -c1k .bash_historyпрочитайте первые 38 строк моего файла .bash_history. Все было читабельно
answerSeeker
2
@TatakaiWasumi Каков выход grep -a git .bash_history?
Heemayl
1
Это сработало! Я получил все, что хотел от этого. Что делает -a?
Ответ Искатель
6
@TatakaiWasumi -aпозволяет grepобрабатывать файл как двоичный файл.
Heemayl
3
-aсделать grepпроцесс двоичного файла, как если бы это был текст.
lashgar
129

Вы можете использовать grep -a 'pattern'.

от man grep page:

-a, --text
Process a binary file as if it were text; this is equivalent to the ‘--binary-files=text’ option.
AK_
источник
Это помогло мне при использовании -zфлага для соответствия нескольким строкам.
Страгу
Этот ответ должен быть лучшим для этого вопроса.
Майкл Пачеко
Да, этот ответ гораздо более подходит!
Daywalker
3

Я видел этот вопрос сегодня, потому что у меня была та же самая проблема, когда я хочу grep мой .bash_history. (Небольшое примечание: я переименовал свою историю, чтобы была создана новая. Эта новая история не считалась двоичной.)

В ответе @heemayls говорится, что он grepпринимает имена файлов и catбудет бесполезен. Это не совсем правда. Из grepсправочной страницы:

Если файлы не указаны или задан файл «-», grep ищет стандартный ввод.

Таким образом, вы можете использовать catи передать это grep. Однако это не решает проблему, которая .bash_historyрассматривается как двоичный файл. Единственное, что нужно - это использовать grep -a(как в ответе @AK_) grepисторию вы напрямую или с catпомощью канала.


cat .bash_history | grep -a git

или же

grep -a git .bash_history

SSCMuchacho
источник
Спасибо! У меня отлично работает
Майкл Пачеко