Zeichenfolgen geben mit grep gefundenen Text nicht aus

Zeichenfolgen geben mit grep gefundenen Text nicht aus

Ich suche nach bestimmten Zeichenfolgen in ausführbaren Dateien (Windows).

Zuerst begann ich mit

grep -a string file

da Binärdateien wie Textdateien behandelt werden. Das Problem dabei ist, dass es keine saubere Ausgabe gibt, Zeilenumbrüche zufällig erfolgen (wenn die richtigen Bytes in der richtigen Reihenfolge sind) usw.pp.

Also dachte ich, ich würde Zeichenfolgen verwenden:

strings file | grep -i string

Zu meinem Erstaunen findet „strings“ keine Strings, die ich mit „grep -a“ finden konnte. Allerdings ist „strings“ insofern nett, als dass es jedes gefundene Element in einer neuen Zeile ausgibt.

Wie bekomme ich das Beste aus beiden Welten? Das heißt, ich möchte wirklich alles finden und auch eine sinnvolle Ausgabe der gefundenen Daten erhalten.

Antwort1

Dass stringsnicht die gleichen Muster wie Ihre Zeichenfolge gefunden werden, liegt höchstwahrscheinlich daran, dass stringsMuster mit einer Länge von mindestens 4 Zeichen gefunden werdenUndgefolgt von einem nicht druckbaren Zeichen. Von man stringsfür GNU strings:

For each file given, GNU strings prints the printable character
sequences that are at least 4 characters long (or the number given
with the options below) and are followed by an unprintable character.

Darüber hinaus stringswerden standardmäßig nur initialisierte und geladene Abschnitte von Objektdateien gescannt, was die Anzahl der ausgegebenen Zeilen weiter reduzieren kann.

Sie können die Optionen -aund ausprobieren -n, um dieses Verhalten zu ändern:

strings -n 1 -a file | grep -i string

Dadurch erhalten Sie mehr Zeichenfolgen und wahrscheinlich alles, was Sie erwarten.

Unterschied in der Ausgabe meiner pythonausführbaren Datei:

$ strings $(which python) | wc
  31923   68075  474068
$ strings -n 1 $(which python) | wc
 501231  531837 1541204
$ strings -n 1 -a $(which python) | wc
 501398  531995 1541762

Antwort2

Warum nicht:

grep -a string file | strings

stringsdruckt die druckbaren Zeichenfolgen, die mindestens 4 Zeichen lang sind. Wenn Sie also grepetwas kürzer als 4 Zeichen benötigen, stringswird es bei der Verarbeitung über zuerst ausgelassen. Verwenden Sie , strings -n 1um die Mindestlänge auf 1 festzulegen.

verwandte Informationen