Manpage for grep
beskriver -I
-flagget som følger :
-I Ignore binary files. This option is equivalent to --binary-file=without-match option.
Det står også dette om binære 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.
Jeg kan ikke tenke av et scenario der jeg bryr meg om treff i binære filer. Hvis et slikt scenario eksisterer, må det absolutt være unntaket i stedet for normen. Hvorfor ignorerer ikke «t grep
binære filer som standard i stedet for å stille dette flagget til å gjøre det?
Kommentarer
- Du kan stille variabelen
GREP_OPTIONS
til dine foretrukne innstillinger, da trenger du ikke ' ikke å bruke så mange kommandolinjebrytere . - Et notat for andre kommandoer som ikke støtter en slik variabel: Du kan angi standardalternativer ved å definere et alias i
.(ba|z|foo)shrc':
alias grep = " grep -I " `. - Dette kan faktisk være veldig nyttig. For eksempel lette jeg etter enhetsversjonen av et prosjekt, og kunne ikke ' ikke huske hvilken fil den ble oppbevart i. Jeg lette etter formatet til versjonen, og den kom opp med noen binære filer som samsvarer. Det viste seg ettersom det var pre-versjon 5, var versjonen bare til stede i en binær fil, så uten binær kamp kunne jeg ha savnet den.
- FYI Ther e ' et verktøy ack som er slags " bedre enn grep ". Ack søker ikke ' t binære filer. I Debian kommer det under navnet " ack-grep ".
Svar
Ikke alt som grep mener er en binær fil, er faktisk en binær fil. f.eks. marionettens logger har ansi fargekoding i seg, noe som får grep til å tro at de er binære. Jeg vil fremdeles søke i dem hvis jeg går gjennom / var / logg.
Kommentarer
- Det samme gjelder PDF-filer som vel.
- + historisk kunne grep IKKE gjøre det, så bare for kompatibilitet må standard være altomfattende.
- @OlivierDulac er det fornuftig, ellers bør ignorering av binære filer være standard.
Svar
grep
evne til å søke binære filer er også nyttige når jeg kompilerer et program og linkeren (ld
) klager over at noen funksjoner ikke blir funnet. Jeg kan bruke en kommando som
grep function_name /lib/lib*
for å finne biblioteket som inneholder det. (Biblioteker er binære filer.)
Kommentarer
- I så fall vil du ' heller bruke
grep -l function_name /lib/lib*
ellernm -Do /lib/lib* | grep function_name
ellerldconfig -p | grep -o '/.*/lib.*' | xargs nm -Do | grep function_name
skjønt. - Vel,
grep some_function /lib/*
er kortere og gir vanligvis riktig svar – navnet på biblioteket jeg leter etter. Men ja, noen ganger kreves det også en mer sofistikert tilnærming som din.