grep kehrt zurück
Die Binärdatei test.log stimmt überein
Beispielsweise
echo "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log # in zsh
echo -e "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log # in bash
grep re test.log
Ich wünschte, das Ergebnis würde Zeile 1 und Zeile 3 (insgesamt zwei Zeilen) anzeigen.
Ist es möglich tr
, die nicht druckbaren Daten in lesbare Daten umzuwandeln, damit grep wieder funktioniert?
-e
imecho
Befehl?Antworten:
Sie können die Datendatei
cat -v
zdie dann weiter nachbearbeitet werden könnte, um den Müll zu entfernen; Dies ist am analogsten zu Ihrer Abfrage zur Verwendung
tr
für die Aufgabe.quelle
man cat
sagt-v
:-v, --show-nonprinting
use ^ and M- notation, except for LFD and TAB
set | cat -v | grep variable
grep --text
funktioniert nicht immer; es respektiert STRG + D als Datei-Terminator. Wenn Sie das in Ihrer Binärdatei haben, wird grep vorzeitig beendet.Einfacher geht es nicht.
quelle
grep --text
was paxdiablo 2 Jahre zuvor erwähnt hatLC_ALL="C" grep -a
Eine Möglichkeit besteht darin, Binärdateien ohnehin einfach als Text zu behandeln.
grep --text
Dies kann jedoch dazu führen, dass Binärinformationen an Ihr Terminal gesendet werden. Das ist keine gute Idee, wenn Sie ein Terminal verwenden, das den Ausgabestream interpretiert (z. B. VT / DEC oder viele andere).Alternativ können Sie Ihre Datei
tr
mit dem folgenden Befehl senden :Dadurch wird weniger als ein Leerzeichen (außer Zeilenumbruch) und mehr als 126 in ein
.
Zeichen umgewandelt, wobei nur die Ausdrucke übrig bleiben .Wenn Sie möchten, dass jedes "illegale" Zeichen durch ein anderes ersetzt wird, können Sie das folgende C-Programm verwenden, einen klassischen Standardeingabefilter:
Dies gibt Ihnen an
{{NN}}
, woNN
sich der Hex-Code für das Zeichen befindet. Sie können das einfachprintf
für jeden gewünschten Ausgabestil anpassen .Sie können dieses Programm hier in Aktion sehen, wo es:
quelle
tr '[:cntrl:] '.'
ist besser. Und es sollte\000-\010\013\014\016-\037\177-\377'
in Ihrer tr-Syntax sein.tr '[\000-\010\013\014\016-\037\177-\377]' '_'
funktionsfähig, ist die cntrl nicht für meinen Fall geeignet.cat
Schritt speichern , indem Siegrep --text
intr
statt umgekehrt einleiten. Auf diese Weise können Sie auch mehrere Dateien durchsuchen und die Dateinamenreferenz in der Ausgabe beibehalten.Sie können beispielsweise "Zeichenfolgen" verwenden, um Zeichenfolgen aus einer Binärdatei zu extrahieren
quelle
Sie können grep zwingen, Binärdateien anzuzeigen mit:
Vielleicht möchten Sie auch
-o
(--only-matching
) hinzufügen, damit Sie nicht Tonnen von binärem Kauderwelsch erhalten, der Ihr Terminal belastet.quelle
--only-matching
und Ihr regulärer Ausdruck nicht mit beliebigen Binärdaten übereinstimmt, haben Sie kein Problem.Ab Grep 2.21 werden Binärdateien unterschiedlich behandelt :
Was jetzt passiert, ist, dass bei Binärdaten alle Nicht-Text-Bytes (einschließlich Zeilenumbrüche) als Zeilenabschlüsse behandelt werden. Wenn Sie dieses Verhalten ändern möchten, können Sie:
verwenden
--text
. Dadurch wird sichergestellt, dass nur Zeilenumbrüche Leitungsabschlusszeichen sindverwenden
--null-data
. Dadurch wird sichergestellt, dass nur Nullbytes Zeilenabschlusszeichen sindquelle
grep -a erzwingt die Suche und Ausgabe von grep aus einer Datei, die grep für binär hält. grep -a re test.log
quelle
Wie James Selvakumar bereits sagte,
grep -a
macht er den Trick. -a oder --text zwingt Grep, den Eingabestream als Text zu behandeln. Siehe Manpage http://unixhelp.ed.ac.uk/CGI/man-cgi?grepVersuchen
quelle
du kannst tun
Dadurch wird die Ausgabe von give als lesbare Zeichenfolge in grep konvertiert.
quelle
Sie können auch das Word Extractor- Tool ausprobieren . Word Extractor kann mit jeder Datei auf Ihrem Computer verwendet werden, um die Zeichenfolgen, die menschlichen Text / Wörter enthalten, vom Binärcode (exe-Anwendungen, DLLs) zu trennen.
quelle
Folgendes habe ich in einem System verwendet, in dem der Befehl "strings" nicht installiert war
Dies druckt den Text und entfernt nicht druckbare Zeichen auf einen Schlag, im Gegensatz zu "cat -v filename", bei dem eine Nachbearbeitung erforderlich ist, um unerwünschte Inhalte zu entfernen. Beachten Sie, dass einige der Binärdaten möglicherweise druckbar sind, sodass Sie immer noch etwas Kauderwelsch zwischen den guten Sachen bekommen. Ich denke, Strings entfernen auch diesen Kauderwelsch, wenn Sie das verwenden können.
quelle