grep returnerer “ Binærfil (standardinngang) samsvarer med ” når du prøver å finne et strengmønster i filen

I «m på Ubuntu og jeg skrev cat .bash_history | grep git og den returnerte

Binærfil (standardinngang) samsvarer

Min bash_history finnes og det er mange linjer i den som starter med git.

Hva forårsaket denne feilen og hvordan kan jeg fikse den?

Kommentarer

  • Hva er utdata fra file .bash_history (file ~/.bash_history)?
  • utgangen er .bash_history: data
  • av en eller annen grunn skjedde dette bare med apache-loggene mine. takk for q & a
  • veldig nært beslektet: unix.stackexchange.com/q/19907/5510

Svar

Presuma filen .bash_history begynner med data som ikke er tekst, og derfor behandler grep filen som binær. Dette bekreftes av file .bash_history utdata:

.bash_history: data 

Du kan lese noen få byte fra start for å ha en samsvarende visning:

head -c1K .bash_history 

Her leser jeg først 1 KiB.

Du kan pipe STDOUT til hexdump / od eller lignende.


Som en sidemerknad tar grep filnavn ( s) som argument, så cat er ubrukelig her; prøv dette:

grep git .bash_history 

Kommentarer

  • I ' Jeg er fortsatt ikke sikker på hvordan grep-problemet skal løses. head -c1k .bash_history les de første 38 linjene i .bash_history-filen min. Alt var lesbart
  • @TatakaiWasumi Hva er resultatet av grep -a git .bash_history?
  • Det fungerte! Jeg fikk alt jeg ønsket av det. Hva gjør -a?
  • @TatakaiWasumi -a gjør grep for å behandle filen som binær.
  • -agrep til å behandle en binær fil som om den var tekst.

Svar

Du kan bruke grep -a "pattern".

fra man grep side:

-a, –text
Behandle en binær fil som om den var tekst; dette tilsvarer –binary-files = text alternativet.

Kommentarer

  • Dette har hjulpet meg når jeg bruker -z -flagget til å matche på tvers av flere linjer.
  • Det har fungert for meg, men fremdeles rart fordi filen min ikke er ' en binær fil. [grid @ serverdg2 trace] $ file listener.log listener.log: data

Svar

Jeg hadde samme problemet når jeg vil grep .bash_history. (Lille merknad: Jeg ga nytt navn til historikken min, slik at en ny ble opprettet. Denne nye historien ble ikke behandlet som en binær.)

I svaret på @heemayls står det at grep tar filnavn og cat ville være ubrukelig. Dette stemmer ikke helt. Fra grep s man-side:

Hvis ingen filer er spesifisert, eller hvis filen “-” er gitt, grep søker på standardinngang.

Så du kan bruke cat og pipe den til grep. Dette løser imidlertid ikke problemet at .bash_history behandles som en binær. Det eneste rette er å bruke grep -a (Som i svaret fra @AK_) enten du grep historien direkte eller med cat og et rør.


cat .bash_history | grep -a git 

eller

grep -a git .bash_history 

Svar

Feil skyldes at dataene i filen er binære, du kan bruke strengekommandoen for å se det menneskelige lesbare (dvs. strings) del som du normalt vil søke med grep

strings data | grep -i whatever

Kommentarer

  • Dette adresserer ikke den første delen av spørsmålet, dvs. " hva som forårsaker problemet ".

Svar

Dette kan være forårsaket av null byte i din bash-historie. Fjerning av linjer med null tegn kan løse problemet. Du kan se etter dem ved hjelp av grep «s Perl-regexp-modus:

grep -Pa "\x00" .bash_history 

Dette innlegget har forslag til ikke-unix-systemer.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *