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
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_historylæ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
-agørgrepat behandle filen som binær. -
-afågreptil 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
-ztil 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.
file .bash_history(file ~/.bash_history)?.bash_history: data