2 つのファイルで正確な単語を grep し、結果をファイルに書き込む

2 つのファイルで正確な単語を grep し、結果をファイルに書き込む

私はそれをやってみました:

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

  1. フィールドに対して一致するという保証はありませんUSERNAME。たとえば、FallenHope@…電子メール アドレスは一致します (ただし、単語を構成する文字ではない-wため役に立ちません)。@
  2. FallenHope-12345一致します (単語を構成する文字ではない-wため役に立ちません)。-

必要がある仕立て屋grep各フォーマットに合うパターン別々に2番目の方が簡単そうです。

USERNAME:[email protected]:ip:ip:hashedpass

次の例では、行の先頭grepを検索します。パターンの末尾に一致するものがない、または一致しないものも検索されます。FallenHope:FallenHope-1FallenHopes

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

関連情報