Dlaczego grep nie ignoruje domyślnie plików binarnych?

94

Strona podręcznika dla grepopisuje -Iflagę w następujący sposób:

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

Mówi również o plikach binarnych:

 --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.

Nie mogę wymyślić scenariusza, w którym dbałbym o dopasowania w plikach binarnych. Jeśli taki scenariusz istnieje, to z pewnością musi być wyjątkiem, a nie normą. Dlaczego grepdomyślnie ignoruje pliki binarne, zamiast wymagać ustawiania tej flagi?

Braiam
źródło
4
Możesz ustawić zmienną GREP_OPTIONSna preferowane ustawienia, wtedy nie musisz używać tylu przełączników wiersza poleceń.
Marco
2
Uwaga dla innych poleceń, które nie obsługują takiej zmiennej: Możesz ustawić domyślne opcje, definiując alias w swoim .(ba|z|foo)shrc': aliasie grep = "grep -I" `.
Erik
1
To może być bardzo przydatne. Na przykład szukałem wersji jedności projektu i nie pamiętałem, w którym pliku był przechowywany. Szukałem formatu wersji i znalazłem kilka pasujących plików binarnych. Okazało się, że była wcześniejsza niż wersja 5, wersja była obecna tylko w pliku binarnym, więc bez dopasowania binarnego mógłbym go przegapić.
Svend Hansen
FYI Jest narzędziem ACK , który jest swego rodzaju „lepiej niż grep”. Ack nie wyszukuje plików binarnych. W Debianie występuje pod nazwą „ack-grep”.
teika kazura

Odpowiedzi:

91

Nie wszystko, co grep uważa za plik binarny, to tak naprawdę plik binarny. np. logi marionetek mają kodowanie kolorów ansi, co sprawia, że ​​grep myśli, że są binarne. Nadal chciałbym je przeszukiwać, jeśli przeglądam / var / log.

Dennis Kaarsemaker
źródło
4
To samo dotyczy plików PDF.
Joseph R.
12
+ historycznie grep NIE mógł tego zrobić, więc tylko ze względu na kompatybilność, domyślnie muszą zawierać wszystkie opcje.
Olivier Dulac
2
@OlivierDulac ma to sens, w przeciwnym razie ignorowanie plików binarnych powinno być domyślnym.
Dagang,
5

grepMożliwość wyszukiwania plików binarnych jest również przydatna, gdy kompiluję program, a linker ( ld) narzeka na brak funkcji. Mogę użyć polecenia takiego jak

grep function_name / lib / lib *

znaleźć bibliotekę, która ją zawiera. (Biblioteki są plikami binarnymi).

Daniel Frużyński
źródło
W takim przypadku, wolisz używać grep -l function_name /lib/lib*albo nm -Do /lib/lib* | grep function_nameczy ldconfig -p | grep -o '/.*/lib.*' | xargs nm -Do | grep function_namechociaż.
Stéphane Chazelas,
Cóż, grep some_function /lib/*jest krótszy i zwykle daje poprawną odpowiedź - nazwa biblioteki szukam. Ale tak, czasem wymagane jest również bardziej wyrafinowane podejście, takie jak twoje.
Daniel Frużyński