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_history
lese 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
-a
machtgrep
um die Datei als binär zu behandeln. -
-a
grep
verarbeitet 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
-z
verwendet 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.