grep gibt “ zurück. Die Binärdatei (Standardeingabe) stimmt mit ” überein, wenn versucht wird, ein Zeichenfolgenmuster in der Datei

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 macht grep 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.