Ich habe Folgendes versucht:
grep FallenHope DATABASE1.txt DATABASE2.sql >> breached.txt
Ich möchte den Benutzernamen FallenHope in zwei Datenbanken nachschlagen, aber sie haben nicht dasselbe Format und für andere Benutzernamen werden nur eine Reihe von Benutzernamen angezeigt, die vom ursprünglichen Benutzernamen abgeleitet sind.
Die Datenbankformate sind:
1 USERNAME [email protected] hashedpass
Und
USERNAME:[email protected]:ip:ip:hashedpass
Ich habe auch versucht,
grep -w FallenHope DATABASE1.txt DATABASE2.sql >> breached.txt
aber es funktioniert immer noch nicht
gibt es Möglichkeiten, das zu tun?
Antwort1
Dies ist, was man 1 grep
darüber sagt grep -w
:
-w
,--word-regexp
Wählen Sie nur die Zeilen aus, die Übereinstimmungen enthalten, die ganze Wörter bilden. Der Test besteht darin, dass die übereinstimmende Teilzeichenfolge entweder am Anfang der Zeile stehen oder von einem Nicht-Wortbestandteil-Zeichen eingeleitet werden muss. Ebenso muss sie entweder am Ende der Zeile stehen oder von einem Nicht-Wortbestandteil-Zeichen gefolgt werden. Wortbestandteil-Zeichen sind Buchstaben, Ziffern und der Unterstrich. […]
Ihr Ansatz weist mindestens zwei Probleme auf, die auf grep FallenHope
oder basieren grep -w FallenHope
:
- Es gibt keine Garantie, dass die Übereinstimmung mit dem
USERNAME
Feld erfolgt. BeispielsweiseFallenHope@…
stimmt die E-Mail-Adresse überein (und-w
hilft nicht, da@
es sich um ein Zeichen handelt, das kein Wortbestandteil ist). FallenHope-12345
stimmt überein (und-w
hilft nicht, weil-
es sich um ein Zeichen handelt, das kein Wortbestandteil ist).
Du brauchstSchneiderdas grep
Muster passend für jedes Formatseparat. Für den zweiten scheint das einfacher zu sein.
USERNAME:[email protected]:ip:ip:hashedpass
Im Folgenden wird ganz am Anfang der Zeile grep
gesucht . Ein Nachkommastellen im Muster macht eine Übereinstimmung unmöglich oder unmöglich.FallenHope
:
FallenHope-1
FallenHopes
grep '^FallenHope:' DATABASE2.sql
Fügen Sie die Umleitung ( >> breached.txt
) hinzu, nachdem Sie sichergestellt haben, dass mein Code das Gewünschte tut.
Und für das erste Format
1 USERNAME [email protected] hashedpass
so etwas sollte funktionieren:
grep '^[[:digit:]]*[[:blank:]]*FallenHope[[:blank:]]' DATABASE1.txt
Es sucht nach null oder mehr Ziffern am Zeilenanfang, gefolgt von null oder mehr Leerzeichen, gefolgt von FallenHope
, gefolgt von einem Leerzeichen. Sie bevorzugen möglicherweise „eine oder mehr“ gegenüber „null oder mehr“, aber wenn das Format streng ist, sollte „null oder mehr“ in Ordnung sein.
Auf jeden Fall musst du das Muster an das Format anpassen. Wenn es Eigenheiten gibt, die ich nicht vorhergesehen habe und die du kennst, passe das Muster entsprechend an.
Ich denke, awk
das kann ich auch. Das Tool ist für die Arbeit mitFelder, dieser Ansatz scheint für diese Aufgabe perfekt geeignet zu sein. Beispielcode:
awk '$2=="FallenHope"' DATABASE1.txt
awk -F : '$1=="FallenHope"' DATABASE2.sql