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
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
rendegrep
per trattare il file come binario. -
-a
makegrep
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.
file .bash_history
(file ~/.bash_history
)?.bash_history: data