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_history
lees 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
-a
maaktgrep
om het bestand als binair te behandelen. -
-a
laatgrep
een 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
-z
vlag 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