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
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örgrep
att behandla filen som binär. -
-a
görgrep
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.
file .bash_history
(file ~/.bash_history
)?.bash_history: data