grep returnerar “ Binär fil (standardinmatning) matchar ” när du försöker hitta ett strängmönster i filen

I ”m på Ubuntu och jag skrev cat .bash_history | grep git och den returnerade

Binärfil (standardinmatning) matchar

Min bash_history finns och det finns många rader i den som börjar med git.

Vad orsakade att detta fel visades och hur kan jag åtgärda det?

Kommentarer

  • Vad är utdata från file .bash_history (file ~/.bash_history)?
  • är utgången .bash_history: data
  • av någon anledning hände detta bara med mina apache-loggar. tack för q & a
  • mycket nära besläktad: unix.stackexchange.com/q/19907/5510

Svar

Presuma filen .bash_history börjar med data som inte är text, och därför behandlas grep filen som binär. Detta bekräftas av file .bash_history -utgången:

.bash_history: data 

Du kan läsa några byte från början för att ha en visa:

head -c1K .bash_history 

Här läser jag först 1 KiB.

Du kan leda STDOUT till hexdump / od eller liknande.


Som en sidoteckning tar grep filnamn ( s) som argument, så cat är värdelös här; prova det här:

grep git .bash_history 

Kommentarer

  • I ' Jag är fortfarande inte säker på hur man löser grep-problemet, head -c1k .bash_history läser de första 38 raderna i min .bash_history-fil. Allt var läsbart
  • @TatakaiWasumi Vad är resultatet av grep -a git .bash_history?
  • Det fungerade! Jag fick allt jag ville ha av det. Vad gör -a?
  • @TatakaiWasumi -a gör grep att behandla filen som binär.
  • -a gör grep bearbeta en binär fil som om den vore text.

Svar

Du kan använda grep -a "pattern".

från man grep sida:

-a, –text
Behandla en binär fil som om den vore text; detta motsvarar alternativet –binary-files = text .

Kommentarer

  • Detta har hjälpt mig när jag använder flaggan -z för att matcha över flera rader.
  • Det har fungerat för mig, men fortfarande konstigt eftersom min fil inte är ' som en binär fil. [grid @ serverdg2 trace] $ file listener.log listener.log: data

Answer

Jag hade samma problem när jag vill grep min .bash_history. (Liten anmärkning: Jag bytte namn på min historik så att en ny skapades. Denna nya historia behandlades inte som en binär.)

I @heemayls svar står det att grep tar filnamn och cat skulle vara värdelös. Detta är inte helt sant. Från grep s mansida:

Om inga filer anges, eller om filen “-” är given, grep söker standardinmatning.

Så du kan använda cat och leda den till grep. Detta löser dock inte problemet att .bash_history behandlas som en binär. Det enda rätta är att använda grep -a (som i svaret från @AK_) oavsett om du grep historiken direkt eller med cat och ett rör.


cat .bash_history | grep -a git 

eller

grep -a git .bash_history 

Svar

Fel beror på att data i filen är binära, du kan använda kommandot strängar för att se den mänskliga läsbara (dvs. strings) del som du normalt skulle söka med grep

strings data | grep -i whatever

Kommentarer

  • Detta tar inte upp den första delen av frågan, dvs " vad som orsakar frågan ".

Svar

Detta kan orsakas av null byte i din bash-historik. Att ta bort rader med noll tecken kan lösa problemet. Du kan söka efter dem med grep ”s Perl-regexp-läge:

grep -Pa "\x00" .bash_history 

Detta inlägg har förslag för icke-unix-system.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *