grep retourneert “ Binair bestand (standaardinvoer) komt overeen met ” bij het zoeken naar een stringpatroon in bestand

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

  • Wat is de output van file .bash_history (file ~/.bash_history)?
  • de output is .bash_history: data
  • om de een of andere reden gebeurde dit gewoon met mijn apache-logboeken. bedankt voor de q & a
  • zeer nauw verwant: unix.stackexchange.com/q/19907/5510

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 maakt grep om het bestand als binair te behandelen.
  • -a laat grep 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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *