Perché grep non ignora i file binari per impostazione predefinita?


94

La manpage per grepdescrive la -Ibandiera come segue:

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

Lo dice anche sui file binari:

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

Non riesco a pensare a uno scenario in cui mi interessi delle corrispondenze nei file binari. Se esiste uno scenario del genere, sicuramente deve essere l'eccezione piuttosto che la norma. Perché non grepignora i file binari per impostazione predefinita anziché richiedere l'impostazione di questo flag per farlo?


4
È possibile impostare la variabile GREP_OPTIONSsulle impostazioni preferite, quindi non è necessario utilizzare molte opzioni della riga di comando.
Marco

2
Una nota per altri comandi che non supportano una tale variabile: puoi impostare le opzioni predefinite definendo un alias nel tuo .(ba|z|foo)shrc': alias grep = "grep -I" `.
Erik,

1
Questo può effettivamente essere molto utile. Ad esempio, stavo cercando la versione di unità di un progetto e non riuscivo a ricordare in quale file fosse contenuto. Ho cercato il formato della versione e ho trovato alcuni file binari corrispondenti. Si è scoperto che era pre-versione 5, la versione era presente solo in un file binario, quindi senza la corrispondenza binaria, avrei potuto perderlo.
Svend Hansen,

FYI C'è uno strumento ack che è un po '"meglio di grep". Ack non cerca i file binari. In Debian, viene chiamato "ack-grep".
teika kazura,

Risposte:


91

Non tutto ciò che Grep pensa sia un file binario, in realtà è un file binario. ad esempio, i registri delle marionette contengono codici colore ansi, il che fa pensare a grep di essere binario. Vorrei comunque cercarli se sto passando in rassegna / var / log.


4
Lo stesso vale per i file PDF.
Joseph R.,

12
+ storicamente grep NON poteva farlo, quindi solo per compatibilità, il default deve essere tutto compreso.
Olivier Dulac,

2
@OlivierDulac ha senso, altrimenti ignorare i file binari dovrebbe essere l'impostazione predefinita.
Dagang,

5

grepLa capacità di cercare file binari è utile anche quando sto compilando un programma e il linker ( ld) si lamenta di alcune funzioni non trovate. Posso usare un comando come

grep nome_funzione / lib / lib *

per trovare la libreria che la contiene. (Le librerie sono file binari.)


In tal caso, preferiresti usare grep -l function_name /lib/lib*o nm -Do /lib/lib* | grep function_nameo ldconfig -p | grep -o '/.*/lib.*' | xargs nm -Do | grep function_namecomunque.
Stéphane Chazelas,

Bene, grep some_function /lib/*è più breve e di solito dà la risposta corretta - il nome della biblioteca che sto cercando. Ma sì, a volte è richiesto anche un approccio più sofisticato come il tuo.
Daniel Frużyński,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.