grep vrací “ Binární soubor (standardní vstup) odpovídá ” při pokusu o nalezení řetězcového vzoru v souboru

Jsem v Ubuntu a zadal jsem cat .bash_history | grep git a vrátil se

Binární soubor (standardní vstup) odpovídá

Můj bash_history existuje a je v něm mnoho řádků která začíná git.

Co způsobilo zobrazení této chyby a jak ji mohu opravit?

Komentáře

  • Jaký je výstup file .bash_history (file ~/.bash_history)?
  • výstup .bash_history: data
  • z nějakého důvodu se to právě dělo s mými protokoly apache. děkuji za q & a
  • velmi úzce související: unix.stackexchange.com/q/19907/5510

Odpověď

Presuma bly soubor .bash_history začíná netextovými daty, a proto grep považuje soubor za binární. Potvrzuje to výstup file .bash_history:

.bash_history: data 

Od začátku si můžete přečíst několik bajtů, abyste měli vyhovující zobrazit:

head -c1K .bash_history 

Zde čtu nejprve 1 KiB.

STDOUT můžete poslat potrubím na hexdump / od nebo podobné.


Poznámka: grep přebírá název souboru ( s) jako argument, takže cat je zde k ničemu; vyzkoušejte toto:

grep git .bash_history 

Komentáře

  • I 'head -c1k .bash_history přečíst prvních 38 řádků mého souboru .bash_history. Všechno bylo čitelné
  • @TatakaiWasumi Jaký je výstup grep -a git .bash_history?
  • To fungovalo! Dostal jsem z toho vše, co jsem chtěl. Co -a dělá?
  • @TatakaiWasumi -a dělá grep považovat soubor za binární.
  • -a vytvořit grep zpracovat binární soubor, jako by to byl text.

Odpověď

Můžete použít grep -a "pattern".

ze stránky man grep :

-a, –text
Zpracuje binární soubor, jako by to byl text; to odpovídá volbě –binary-files = text .

Komentáře

  • To mi pomohlo při použití příznaku -z pro shodu na několika řádcích.
  • Fungovalo to pro mě, ale stále divně, protože můj soubor není ' ta binární soubor. [grid @ serverdg2 trace] $ file listener.log listener.log: data

Odpověď

Měl jsem stejný problém, když chci pozdravit svůj .bash_history. (Malá poznámka: Přejmenoval jsem svou historii, aby byla vytvořena nová. Tato nová historie nebyla považována za binární.)

V odpovědi @heemayls je uvedeno, že grep přebírá názvy souborů a cat by byl k ničemu. To není úplně pravda. Z grep s manuálové stránky:

Pokud nejsou zadány žádné soubory nebo pokud je soubor „-“ vzhledem k tomu, grep prohledá standardní vstup.

Takže můžete použít cat a přesměrovat jej na grep. To však nevyřeší problém, že .bash_history je považován za binární. Jediná správná věc je použít grep -a (jako v odpovědi od @AK_), ať už grep historii přímo nebo s cat a potrubí.


cat .bash_history | grep -a git 

nebo

grep -a git .bash_history 

Odpověď

Chyba je způsobena tím, že data v souboru jsou binární, můžete použít příkaz strings, abyste viděli člověka čitelného (tj. strings) část, kterou byste normálně hledali pomocí grep

strings data | grep -i whatever

Komentáře

  • Tím se neřeší první část otázky, tj. " co způsobuje problém ".

Odpověď

Může to být způsobeno nulovými bajty ve vaší historii bash. Problém může vyřešit odebrání řádků s nulovými znaky. Můžete je zkontrolovat pomocí režimu Perl-regexp grep:

grep -Pa "\x00" .bash_history 

Tento příspěvek má návrhy pro systémy jiné než unix.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *