grep returnerer “ Binær fil (standardindgang) matcher ” når du prøver at finde et strengmønster i fil

I “m på Ubuntu, og jeg skrev cat .bash_history | grep git og det vendte tilbage

Binær fil (standardindgang) matcher

Min bash_history findes, og der er mange linjer i den der starter med git.

Hvad fik denne fejl til at vise, og hvordan kan jeg rette den?

Kommentarer

  • Hvad er output fra file .bash_history (file ~/.bash_history)?
  • output er .bash_history: data
  • af en eller anden grund skete dette bare med mine apache-logfiler. tak for q & a
  • meget nært beslægtet: unix.stackexchange.com/q/19907/5510

Svar

Presuma filen .bash_history begynder med data, der ikke er tekst, og derfor behandler grep filen som binær. Dette bekræftes af file .bash_history output:

.bash_history: data 

Du kan læse et par bytes fra start for at have en overensstemmelse view:

head -c1K .bash_history 

Her læser jeg først 1 KiB.

Du kan pibe STDOUT til hexdump / od eller lignende.


Som en sidebemærkning tager grep filnavn ( s) som argument, så cat er ubrugelig her; prøv dette:

grep git .bash_history 

Kommentarer

  • I ' Jeg er stadig ikke sikker på, hvordan grep-problemet skal løses, head -c1k .bash_history læser de første 38 linjer i min .bash_history-fil. Alt var læsbart
  • @TatakaiWasumi Hvad er output fra grep -a git .bash_history?
  • Det fungerede! Jeg fik alt, hvad jeg ville have af det. Hvad gør -a?
  • @TatakaiWasumi -a gør grep at behandle filen som binær.
  • -agrep til at behandle en binær fil, som om den var tekst.

Svar

Du kan bruge grep -a "pattern".

fra man grep side:

-a, –text
Behandl en binær fil som om den var tekst; dette svarer til –binary-files = text mulighed.

Kommentarer

  • Dette har hjulpet mig, når jeg bruger flagget -z til at matche på tværs af linjer.
  • Det har fungeret for mig, men stadig underligt, fordi min fil ikke er ' en binær fil. [grid @ serverdg2 trace] $ fil listener.log listener.log: data

Svar

Jeg havde samme problem, når jeg vil gribe min .bash_history. (Lille note: Jeg omdøbte min historie, så der blev oprettet en ny. Denne nye historie blev ikke behandlet som en binær.)

I @heemayls svar står det, at grep tager filnavne og cat ville være ubrugelig. Dette er ikke helt sandt. Fra grep s man-side:

Hvis der ikke er angivet nogen filer, eller hvis filen “-” er givet, grep søger efter standard input.

Så du kan bruge cat og pibe den til grep. Dette løser dog ikke problemet, at .bash_history behandles som en binær. Den eneste rigtige ting er at bruge grep -a (Som i svaret fra @AK_), uanset om du grep historikken direkte eller med cat og et rør.


cat .bash_history | grep -a git 

eller

grep -a git .bash_history 

Svar

Fejl skyldes, at dataene i filen er binære, du kan bruge kommandoen strings til at se det menneskelige læsbare (dvs. strings) del, som du normalt vil søge ved hjælp af grep

strings data | grep -i whatever

Kommentarer

  • Dette adresserer ikke den første del af spørgsmålet, dvs. " hvad der forårsager problemet ".

Svar

Dette kan skyldes af null bytes i din bash-historie. Fjernelse af linjer med nul tegn kan løse problemet. Du kan tjekke for dem ved hjælp af grep “s Perl-regexp-tilstand:

grep -Pa "\x00" .bash_history 

Dette indlæg har forslag til ikke-unix-systemer.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *