Manpage för grep
beskriver -I
-flaggan enligt följande :
-I Ignore binary files. This option is equivalent to --binary-file=without-match option.
Det står också detta om binära filer:
--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.
Jag kan inte tänka av ett scenario där jag skulle bry mig om matchningar i binära filer. Om ett sådant scenario existerar måste det säkert vara undantaget snarare än normen. Varför ignorerar inte ”t grep
binära filer som standard istället för att ställa in den här flaggan för att göra det?
Kommentarer
- Du kan ställa in variabeln
GREP_OPTIONS
till dina önskade inställningar, då behöver du inte ' så många kommandoradsväxlar . - En anmärkning för andra kommandon som inte stöder en sådan variabel: Du kan ställa in standardalternativ genom att definiera ett alias i ditt
.(ba|z|foo)shrc':
alias grep = " grep -I " `. - Detta kan faktiskt vara mycket användbart. Till exempel letade jag efter enhetsversionen av ett projekt och kunde inte ' t komma ihåg vilken fil den förvarades i. Jag sökte efter formatet på versionen och det kom med några binära filer som matchade. Det visade sig eftersom det var före version 5 fanns versionen bara i en binär fil, så utan den binära matchningen kanske jag har missat den.
- FYI Ther e ' ett verktyg ack vilket är typ av " bättre än grep ". Ack söker inte ' t binära filer. I Debian kommer det under namnet " ack-grep ".
Svar
Inte allt som grep tycker är en binär fil, är faktiskt en binär fil. t.ex. marionettens loggar har ansi färgkodning i sig, vilket får grep att tro att de är binära. Jag vill fortfarande söka efter dem om jag går igenom / var / log men.
Kommentarer
- Detsamma gäller för PDF-filer som väl.
- + historiskt sett kunde grep INTE göra det, så för kompatibilitet måste standard vara allomfattande.
- @OlivierDulac är det vettigt, annars bör det vara att ignorera binära filer standard.
Svar
grep
förmåga att söka binära filer är också användbara när jag kompilerar ett program och länken (ld
) klagar över att någon funktion inte hittas. Jag kan använda ett kommando som
grep function_name /lib/lib*
för att hitta biblioteket som innehåller det. (Bibliotek är binära filer.)
Kommentarer
- I så fall använder du '
grep -l function_name /lib/lib*
ellernm -Do /lib/lib* | grep function_name
ellerldconfig -p | grep -o '/.*/lib.*' | xargs nm -Do | grep function_name
dock. - Tja,
grep some_function /lib/*
är kortare och ger vanligtvis rätt svar – namnet på biblioteket jag letar efter. Men ja, ibland krävs också mer sofistikerade tillvägagångssätt som dina.