Почему grep не игнорирует двоичные файлы по умолчанию?


94

Страница руководства для grepописывает -Iфлаг следующим образом:

-I      Ignore binary files.  This option is equivalent to 
        --binary-file=without-match option.

Это также говорит об двоичных файлах:

 --binary-files=value Controls searching and printing of binary files.
         Options are binary, the default: search binary files but do not print
         them; without-match: do not search binary files; and text: treat all
         files as text.

Я не могу придумать сценарий, в котором мне нужно было бы искать совпадения в двоичных файлах. Если такой сценарий существует, он должен быть скорее исключением, чем нормой. Почему не grepигнорировать двоичные файлы по умолчанию, вместо того, чтобы устанавливать для этого флаг?


4
Вы можете установить переменную GREP_OPTIONSв соответствии с вашими предпочтениями, тогда вам не нужно использовать столько переключателей командной строки.
Марко

2
Примечание для других команд, которые не поддерживают такую ​​переменную: Вы можете установить параметры по умолчанию, определив псевдоним в своем .(ba|z|foo)shrc': псевдониме grep = "grep -I" `.
Эрик

1
Это на самом деле может быть очень полезным. Например, я искал единую версию проекта и не мог вспомнить, в каком файле он хранился. Я искал формат версии, и он нашел несколько бинарных файлов, которые соответствуют. Оказалось, что это было до версии 5, версия присутствовала только в двоичном файле, поэтому без двоичного совпадения я мог бы пропустить это.
Свенд Хансен

FYI Там есть инструмент извед который является своего рода «лучше , чем Grep». Ack не ищет двоичные файлы. В Debian он называется «ack-grep».
Тейка Казура

Ответы:


91

Не все, что grep считает двоичным файлом, на самом деле является двоичным файлом. Например, в журналах Puppet есть цветовая кодировка ANSI, что заставляет grep думать, что они двоичные. Я все еще хотел бы искать их, если я просматривал / var / log все же.


4
То же самое относится и к PDF-файлам.
Джозеф Р.

12
+ исторически grep НЕ мог этого сделать, поэтому для совместимости только default должно быть включено.
Оливье Дюлак

2
@OlivierDulac это имеет смысл, иначе игнорирование двоичных файлов должно быть по умолчанию.
Даганг

5

grepВозможность поиска бинарных файлов также полезна, когда я компилирую программу, а компоновщик ( ld) жалуется на отсутствие какой-либо функции. Я могу использовать команду как

Grep function_name / Библиотека / Библиотека *

найти библиотеку, в которой он содержится. (Библиотеки - это двоичные файлы.)


В этом случае вы бы предпочли использовать grep -l function_name /lib/lib*или nm -Do /lib/lib* | grep function_nameили ldconfig -p | grep -o '/.*/lib.*' | xargs nm -Do | grep function_nameхотя.
Стефан Шазелас

Ну, grep some_function /lib/*короче и обычно дает правильный ответ - название библиотеки, которую я ищу. Но да, иногда требуется и более сложный подход, как у вас.
Даниэль Фрушинский
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.