Ik “m op Ubuntu en ik typte cat .bash_history | grep git en het keerde terug
Binair bestand (standaard invoer) komt overeen
Mijn bash_history bestaat en er staan veel regels in dat begint met git.
Wat veroorzaakte dat deze fout werd weergegeven en hoe kan ik deze oplossen?
Opmerkingen
Antwoord
Presuma bly het bestand .bash_history begint met niet-tekstuele gegevens, daarom behandelt grep het bestand als binair. Dit wordt bevestigd door de file .bash_history uitvoer:
.bash_history: data
Je kunt een paar bytes vanaf het begin lezen om een conforme view:
head -c1K .bash_history
Hier lees ik eerst 1 KiB.
Je kunt de STDOUT doorsluizen naar hexdump / od of vergelijkbaar.
Als een kanttekening: grep neemt de bestandsnaam ( s) als argument, dus cat is hier nutteloos; probeer dit:
grep git .bash_history
Reacties
- I ' Ik weet nog steeds niet zeker hoe ik het grep-probleem moet oplossen,
head -c1k .bash_historylees de eerste 38 regels van mijn .bash_history-bestand. Alles was leesbaar - @TatakaiWasumi Wat is de output van
grep -a git .bash_history? - Dat werkte! Ik heb er alles van gekregen wat ik wilde. Wat doet
-a? - @TatakaiWasumi
-amaaktgrepom het bestand als binair te behandelen. -
-alaatgrepeen binair bestand verwerken alsof het tekst is.
Answer
Je kunt grep -a "pattern" gebruiken.
van man grep pagina:
-a, –text
Verwerk een binair bestand alsof het tekst is; dit komt overeen met de –binary-files = text optie.
Reacties
- Dit heeft me geholpen bij het gebruik van de
-zvlag om op verschillende regels te matchen. - Het heeft voor mij gewerkt, maar nog steeds raar omdat mijn bestand geen ' een binair bestand is. [grid @ serverdg2 trace] $ file listener.log listener.log: data
Answer
Ik had de hetzelfde probleem als ik mijn .bash_history wil grepen. (Kleine opmerking: ik heb mijn geschiedenis hernoemd, zodat er een nieuwe is gemaakt. Deze nieuwe geschiedenis werd niet als een binair bestand behandeld.)
In het antwoord van @heemayls wordt vermeld dat grep accepteert bestandsnamen en cat zou nutteloos zijn. Dit is niet helemaal waar. Van grep s man-pagina:
Als er geen bestanden zijn gespecificeerd, of als het bestand “-” is gegeven, zoekt grep standaardinvoer.
Dus je zou cat kunnen gebruiken en het naar grep. Dit lost echter niet het probleem op dat .bash_history als een binair bestand wordt behandeld. Het enige juiste is om grep -a (zoals in het antwoord van @AK_) te gebruiken, ongeacht of je de geschiedenis grep rechtstreeks of met cat en een pijp.
cat .bash_history | grep -a git
of
grep -a git .bash_history
Answer
Fout is te wijten aan het feit dat de gegevens in het bestand binair zijn, u kunt het strings-commando gebruiken om het door mensen leesbare te zien (bijv. strings) deel dat u normaal zou doorzoeken met grep
strings data | grep -i whatever
Opmerkingen
- Dit gaat niet in op het eerste deel van de vraag, dwz " wat veroorzaakt het probleem ".
Antwoord
Dit kan worden veroorzaakt door null bytes in je bash-geschiedenis. Het probleem kan mogelijk worden opgelost door regels met null-tekens te verwijderen. Je kunt ze controleren met de Perl-regexp-modus van grep:
grep -Pa "\x00" .bash_history
Dit bericht heeft suggesties voor niet-Unix-systemen.
file .bash_history(file ~/.bash_history)?.bash_history: data