grep ein genaues Wort in 2 Dateien, dann schreibe das Ergebnis in eine Datei

grep ein genaues Wort in 2 Dateien, dann schreibe das Ergebnis in eine Datei

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 grepdarü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 FallenHopeoder basieren grep -w FallenHope:

  1. Es gibt keine Garantie, dass die Übereinstimmung mit dem USERNAMEFeld erfolgt. Beispielsweise FallenHope@…stimmt die E-Mail-Adresse überein (und -whilft nicht, da @es sich um ein Zeichen handelt, das kein Wortbestandteil ist).
  2. FallenHope-12345stimmt überein (und -whilft nicht, weil -es sich um ein Zeichen handelt, das kein Wortbestandteil ist).

Du brauchstSchneiderdas grepMuster 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 grepgesucht . Ein Nachkommastellen im Muster macht eine Übereinstimmung unmöglich oder unmöglich.FallenHope:FallenHope-1FallenHopes

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, awkdas 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

verwandte Informationen