私はそれをやってみました:
grep FallenHope DATABASE1.txt DATABASE2.sql >> breached.txt
FallenHope のユーザー名を 2 つのデータベースで検索したいのですが、形式が異なり、他のユーザー名については、元のユーザー名から派生した一連のユーザー名が表示されます。
データベースの形式は次のとおりです。
1 USERNAME [email protected] hashedpass
そして
USERNAME:[email protected]:ip:ip:hashedpass
私もやってみました
grep -w FallenHope DATABASE1.txt DATABASE2.sql >> breached.txt
しかし、まだ機能しません
それを実行する方法はありますか?
答え1
以下man 1 grep
について述べますgrep -w
:
-w
,--word-regexp
単語全体を形成する一致を含む行のみを選択します。テストでは、一致する部分文字列が行の先頭にあるか、単語を構成しない文字が先行している必要があります。同様に、行の末尾にあるか、単語を構成しない文字が後続している必要があります。単語を構成する文字は、文字、数字、およびアンダースコアです。[…]
grep FallenHope
またはに基づくアプローチには少なくとも 2 つの問題がありますgrep -w FallenHope
。
- フィールドに対して一致するという保証はありません
USERNAME
。たとえば、FallenHope@…
電子メール アドレスは一致します (ただし、単語を構成する文字ではない-w
ため役に立ちません)。@
FallenHope-12345
一致します (単語を構成する文字ではない-w
ため役に立ちません)。-
必要がある仕立て屋grep
各フォーマットに合うパターン別々に2番目の方が簡単そうです。
USERNAME:[email protected]:ip:ip:hashedpass
次の例では、行の先頭grep
を検索します。パターンの末尾に一致するものがない、または一致しないものも検索されます。FallenHope
:
FallenHope-1
FallenHopes
grep '^FallenHope:' DATABASE2.sql
>> breached.txt
コードが目的の動作をすることを確認した後、リダイレクト ( ) を追加してください。
そして最初のフォーマットでは
1 USERNAME [email protected] hashedpass
次のようなものが機能するはずです:
grep '^[[:digit:]]*[[:blank:]]*FallenHope[[:blank:]]' DATABASE1.txt
行の先頭に 0 個以上の数字があり、その後に 0 個以上の空白があり、その後にFallenHope
、さらに空白が続くものを検索します。「0 個以上」よりも「1 個以上」の方が適しているかもしれませんが、形式が厳密な場合は「0 個以上」でも問題ありません。
いずれにしても、パターンをフォーマットに合わせて調整する必要があります。私が予想していなかった癖があり、それを知っている場合は、それに応じてパターンを調整してください。
awk
これもできると思います。このツールは、田畑このアプローチは、この仕事に最適と思われます。サンプルコード:
awk '$2=="FallenHope"' DATABASE1.txt
awk -F : '$1=="FallenHope"' DATABASE2.sql