grep повертає "Бінарний файл (стандартний вхід) відповідає", коли намагається знайти рядок у файлі


70

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

Бінарний файл (стандартний вхід) відповідає

Моє bash_historyіснує, і в ньому багато рядків, що починається з git.

Що спричинило відображення цієї помилки та як її виправити?


Який вихід file .bash_history( file ~/.bash_history)?
heemayl

вихід.bash_history: data
відповідь

чомусь це саме відбувається з моїми журналами apache. дякую за
запитання

дуже тісно пов’язані: 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

Я досі не впевнений, як вирішити проблему grep, head -c1k .bash_historyпрочитав перші 38 рядків мого файлу .bash_history. Все було
читано

2
@TatakaiWasumi Який результат grep -a git .bash_history?
heemayl

1
Це спрацювало! Я отримав від нього все, що хотів. Що робить -a?
відповідьПрошукувач

6
@TatakaiWasumi -aробить grepлікувати файл в двійковому вигляді.
heemayl

3
-aзробіть grepобробку двійкового файлу так, ніби це текст.
лашгар

127

Можна використовувати grep -a 'pattern'.

зі сторінки " grep man ":

-a, --text
Process a binary file as if it were text; this is equivalent to the ‘--binary-files=text’ option.

Це допомогло мені при використанні -zпрапора збігатися через кілька рядків.
страгу

Ця відповідь повинна бути найкращою для цього питання.
Майкл Пачеко

Так, ця відповідь набагато більше підходить!
Daywalker

3

Я сьогодні бачив це запитання, тому що у мене була така ж проблема, коли я хотів схватити своє .bash_history. (Маленька примітка: я перейменував свою історію так, щоб була створена нова. Ця нова історія не трактувалася як двійкова.)

У @heemayls відповіді зазначено, що grepприймає назви файлів і catбуло б марним. Це не зовсім вірно. З grepсторінки чоловіка s:

Якщо не вказано жодних файлів або якщо файл "-" задано, 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.