Ich bin unter Ubuntu und habe cat .bash_history | grep git eingegeben und
Binärdatei (Standardeingabe) stimmt überein
Meine bash_history ist vorhanden und enthält viele Zeilen Das beginnt mit git.
Was hat zur Anzeige dieses Fehlers geführt und wie kann ich ihn beheben?
Kommentare
- Wie lautet die Ausgabe von
file .bash_history(file ~/.bash_history)? - ist die Ausgabe
.bash_history: data - Aus irgendeinem Grund geschah dies nur mit meinen Apache-Protokollen. Vielen Dank für die q & a
- sehr eng verwandt: unix.stackexchange.com/q/19907/5510
Antwort
Presuma Die Datei .bash_history beginnt mit Nicht-Textdaten, daher behandelt grep die Datei als binär. Dies wird durch die Ausgabe file .bash_history bestätigt:
.bash_history: data
Sie können einige Bytes von Anfang an lesen, um eine Übereinstimmung zu erhalten Ansicht:
head -c1K .bash_history
Hier lese ich zuerst 1 KiB.
Sie können den STDOUT an hexdump / od oder ähnliches.
Als Randnotiz nimmt grep den Dateinamen ( s) als Argument, also ist cat hier nutzlos; Versuchen Sie Folgendes:
grep git .bash_history
Kommentare
- I ' Ich bin mir immer noch nicht sicher, wie ich das grep-Problem lösen soll.
head -c1k .bash_historylese die ersten 38 Zeilen meiner .bash_history-Datei. Alles war lesbar - @TatakaiWasumi Was ist die Ausgabe von
grep -a git .bash_history? - Das hat funktioniert! Ich habe alles bekommen, was ich wollte. Was macht
-a? - @TatakaiWasumi
-amachtgrepum die Datei als binär zu behandeln. -
-agrepverarbeitet eine binäre Datei so, als wäre es Text.
Antwort
Sie können grep -a "pattern" verwenden.
von man grep Seite:
-a, –text
Verarbeitet eine Binärdatei so, als wäre es Text; Dies entspricht der Option –binary-files = text .
Kommentare
- Dies hat mir geholfen, wenn ich das Flag
-zverwendet habe, um über mehrere Zeilen hinweg übereinzustimmen. - Es hat bei mir funktioniert, ist aber immer noch komisch, weil meine Datei nicht ' eine Binärdatei ist. [grid @ serverdg2 trace] $ file listener.log listener.log: data
Antwort
Ich hatte die das gleiche Problem, wenn ich meine .bash_history greifen möchte. (Kleiner Hinweis: Ich habe meinen Verlauf umbenannt, sodass ein neuer erstellt wurde. Dieser neue Verlauf wurde nicht als Binärdatei behandelt.)
In der Antwort von @heemayls wird angegeben, dass grep nimmt Dateinamen an und cat wäre nutzlos. Dies ist nicht ganz richtig. Aus der Manpage von grep:
Wenn keine Dateien angegeben sind oder wenn die Datei „-“ ist vorausgesetzt, grep durchsucht die Standardeingabe.
Sie können also cat verwenden und an grep. Dies löst jedoch nicht das Problem, dass .bash_history als Binärdatei behandelt wird. Das einzig Richtige ist, grep -a (wie in der Antwort von @AK_) zu verwenden, unabhängig davon, ob Sie grep den Verlauf direkt oder mit cat und eine Pipe.
cat .bash_history | grep -a git
oder
grep -a git .bash_history
Antwort
Der Fehler ist darauf zurückzuführen, dass die Daten in der Datei binär sind. Sie können den Befehl strings verwenden, um die lesbare Person zu sehen (dh strings) Teil, den Sie normalerweise mit grep
strings data | grep -i whatever
Kommentare
- Dies behandelt nicht den ersten Teil der Frage, dh " welche Ursachen das Problem ".
Antwort
Dies kann verursacht werden um null Bytes in Ihrem Bash-Verlauf. Das Entfernen von Zeilen mit Nullzeichen kann das Problem beheben. Sie können sie im Perl-Regexp-Modus von grep überprüfen:
grep -Pa "\x00" .bash_history
Dieser Beitrag enthält Vorschläge für Nicht-Unix-Systeme.