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


71

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

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

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

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


Какой вывод file .bash_history( file ~/.bash_history)?
Heemayl

выходной.bash_history: data
answerSeeker

по какой-то причине это происходило с моими логами apache. спасибо за вопросы
Billynoah

Ответы:


11

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

.bash_history: data 

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

head -c1K .bash_history 

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

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


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

grep git .bash_history

Я все еще не знаю, как решить проблему 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.

Это помогло мне при использовании -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


Спасибо! У меня отлично работает
Майкл Пачеко
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.