Ja „m na Ubuntu i wpisałem cat .bash_history | grep git
i wróciło
Plik binarny (standardowe wejście) pasuje
Mój bash_history
istnieje i jest w nim wiele wierszy zaczyna się od git
.
Co spowodowało wyświetlenie tego błędu i jak mogę go naprawić?
Komentarze
Odpowiedz
Presuma bly plik .bash_history
zaczyna się od danych nietekstowych, dlatego grep
traktuje plik jako binarny. Potwierdza to file .bash_history
wyjście:
.bash_history: data
Możesz odczytać kilka bajtów od początku, aby uzyskać zgodny widok:
head -c1K .bash_history
Tutaj czytam pierwszy 1 KiB.
Możesz przesłać STDOUT do hexdump
/ od
lub podobny.
Na marginesie, grep
przyjmuje nazwę pliku ( s) jako argument, więc cat
jest tutaj bezużyteczne; spróbuj tego:
grep git .bash_history
Komentarze
- I ' Nadal nie jestem pewien, jak rozwiązać problem grepa,
head -c1k .bash_history
przeczytaj pierwsze 38 wierszy mojego pliku .bash_history. Wszystko było czytelne. - @TatakaiWasumi. Jaki jest wynik działania
grep -a git .bash_history
? - To zadziałało! Dostałem od niego wszystko, czego chciałem. Co robi
-a
? - @TatakaiWasumi
-a
sprawia, żegrep
traktować plik jako binarny. -
-a
makegrep
przetwarza plik binarny tak, jakby był tekstem.
Odpowiedź
Możesz użyć grep -a "pattern"
.
ze strony man grep :
-a, –text
Przetwarzaj plik binarny tak, jakby był tekstem; jest to odpowiednik opcji –binary-files = text .
Komentarze
- Pomogło mi to przy używaniu flagi
-z
do dopasowania w kilku wierszach. - U mnie zadziałało, ale nadal jest dziwne, ponieważ mój plik nie jest ' plikiem binarnym. [grid @ serverdg2 trace] $ file listener.log listener.log: data
Odpowiedź
Miałem ten sam problem, gdy chcę grepować mój .bash_history
. (Mała uwaga: zmieniłem nazwę mojej historii, aby powstała nowa. Ta nowa historia nie była traktowana jako binarna.)
W odpowiedzi @heemayls jest napisane, że grep
przyjmuje nazwy plików i cat
byłoby bezużyteczne. To nie jest do końca prawdą. Ze strony podręcznika grep
:
Jeśli nie określono żadnych plików lub jeśli plik „-” jest biorąc pod uwagę, grep przeszukuje standardowe wejście.
Więc możesz użyć cat
i przesłać go potokiem do grep
. Jednak to nie rozwiązuje problemu, że .bash_history
jest traktowane jako plik binarny. Jedyną właściwą rzeczą jest użycie grep -a
(jak w odpowiedzi z @AK_) niezależnie od tego, czy grep
historię bezpośrednio, czy z cat
i potok.
cat .bash_history | grep -a git
lub
grep -a git .bash_history
Odpowiedź
Błąd wynika z tego, że dane w pliku są binarne, możesz użyć polecenia string, aby zobaczyć czytelną dla człowieka (tj. strings
) część, którą normalnie szukałbyś za pomocą grep
strings data | grep -i whatever
Komentarze
- To nie dotyczy pierwszej części pytania, tj. " co powoduje problem ".
Odpowiedź
Może to być spowodowane przez null bajtów w Twojej historii bash. Usunięcie wierszy zawierających znaki puste może rozwiązać problem. Możesz je sprawdzić w trybie Perl-regexp grepa:
grep -Pa "\x00" .bash_history
Ten post ma sugestie dla systemów innych niż unix.
file .bash_history
(file ~/.bash_history
)?.bash_history: data