grep restituisce “ Il file binario (input standard) corrisponde a ” quando si cerca di trovare uno schema di stringa nel file

Sono su Ubuntu e ho digitato cat .bash_history | grep git ed è tornato

Il file binario (input standard) corrisponde

Il mio bash_history esiste e ci sono molte righe in esso che inizia con git.

Che cosa ha causato la visualizzazione di questo errore e come posso correggerlo?

Commenti

  • Qual è loutput di file .bash_history (file ~/.bash_history)?
  • loutput è .bash_history: data
  • per qualche motivo questo stava accadendo con i miei log di Apache. grazie per il q & a
  • molto strettamente correlato: unix.stackexchange.com/q/19907/5510

Rispondi

Presuma bly il file .bash_history inizia con dati non di testo, quindi grep tratta il file come binario. Ciò è confermato dalloutput file .bash_history:

.bash_history: data 

Puoi leggere alcuni byte dallinizio per avere un view:

head -c1K .bash_history 

Qui sto leggendo il primo KiB.

Puoi reindirizzare STDOUT a hexdump / od o simile.


Come nota a margine, grep prende il nome del file ( s) come argomento, quindi cat è inutile qui; prova questo:

grep git .bash_history 

Commenti

  • I ' Non sono ancora sicuro di come risolvere il problema di grep, head -c1k .bash_history ho letto le prime 38 righe del mio file .bash_history. Tutto era leggibile
  • @TatakaiWasumi Qual è loutput di grep -a git .bash_history?
  • Ha funzionato! Ho ottenuto tutto quello che volevo da esso. Che cosa fa -a?
  • @TatakaiWasumi -a rende grep per trattare il file come binario.
  • -a make grep elabora un file binario come se fosse testo.

Risposta

Puoi utilizzare grep -a "pattern".

dalla pagina man grep :

-a, –text
Elabora un file binario come se fosse testo; questo è equivalente allopzione –binary-files = text .

Commenti

  • Questo mi ha aiutato quando ho utilizzato il flag -z per trovare corrispondenze su più righe.
  • Ha funzionato per me, ma è ancora strano perché il mio file non è ' un file binario. [grid @ serverdg2 trace] $ file listener.log listener.log: data

Answer

Ho avuto il stesso problema quando desidero eseguire il grep del mio .bash_history. (Piccola nota: ho rinominato la mia cronologia, in modo che ne sia stata creata una nuova. Questa nuova cronologia non è stata trattata come un file binario.)

Nella risposta di @heemayls si afferma che grep accetta i nomi dei file e cat sarebbe inutile. Questo non è del tutto vero. Dalla pagina man di grep:

Se non viene specificato alcun file o se il file “-” è dato, grep cerca linput standard.

Quindi potresti usare cat e reindirizzarlo a grep. Tuttavia, questo non risolve il problema che .bash_history viene trattato come un file binario. Lunica cosa giusta è utilizzare grep -a (come nella risposta di @AK_) sia che tu grep la cronologia direttamente o con cat e una barra verticale.


cat .bash_history | grep -a git 

o

grep -a git .bash_history 

Risposta

Lerrore è dovuto al fatto che i dati nel file sono binari, puoi usare il comando delle stringhe per vedere il testo leggibile dalluomo (es. strings) parte che normalmente cercheresti utilizzando grep

strings data | grep -i whatever

Commenti

  • Questo non risolve la prima parte della domanda, cioè " cosa causa il problema ".

Risposta

Questo può essere causato da byte nulli nella cronologia di bash. La rimozione di righe con caratteri nulli potrebbe risolvere il problema. Puoi verificarli utilizzando la modalità Perl-regexp di grep:

grep -Pa "\x00" .bash_history 

Questo post ha suggerimenti per sistemi non Unix.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *