Bashのリストからパイプされたgrepコマンドを複数実行する

Bashのリストからパイプされたgrepコマンドを複数実行する

セキュリティタスクの一環として、私はsqlite3を使用して、毎日SSHを介して数十のGoogle Chrome履歴ファイルを分析します。

各ユーザーは、数十の承認された「安全な」サイトにアクセスできます。私の目的のために、私はこれらのセキュリティサイトに興味がありません。各履歴ファイルのURLを一覧表示し、セキュリティWebサイトを無視するために、grep -v次のように各セキュリティWebサイトを使用して一覧表示します。

sqlite3 /home/me/HistoryDatabaseFile.db "select * from urls order by url;" | grep -v safesite1.com | grep -v safesite2.com | grep -v safesite3.com | grep -v safesite4.com

など。私のコマンドは少なくとも20行に増え、管理できなくなりました。安全なサイトをリスト形式で除外しながらユーザーにURLリストを表示する方法はありますか?私は次のことを想像しています:

safesite1.com
safesite2.com
safesite3.com

次に、そのリストをコマンドにインポートします。内部でも外部でもかまいません。 bashから出力されるだけで構いません。

助けてくれてありがとう!

答え1

私の考えであなたが探しているものは次のとおりです

grep -vf safe_websites inputfile

-vすでに知っている一致を元に戻すには、-fファイルからパターンをインポートしますsafe_websites

答え2

考えられるもう1つのオプションは、egrep拡張正規表現を使用して複数のターゲットを単一の文字列に入れることができるgrep形式を使用することです。

egrep -v "safesite1\.com|safesite2\.com|safesite3\.com"

これらのREおよびその他の拡張REの詳細については、を参照してくださいman 7 re_format

答え3

前述のように、オプションを使用して使用するモードの-fリストを提供する必要がありますgrepgrep

しかし、URLに特殊文字が含まれていると言われましたが、これは言葉になります。正解は、-Fフラグを使用してgrepパターンを固定文字列としてのみ処理することです。

したがって、必要なものを達成するには:

まず、安全なサイトのリストをファイルに入れてください/tmp/safelist.txt。たとえば、次のようになります。

safesite1.com
safesite2.com
safesite3.com

次に、grep次のようにファイルを呼び出します。

sqlite3 /home/me/HistoryDatabaseFile.db "select * from urls order by url;" | grep -vFf /tmp/safelist.txt

答え4

私の問題は、私が解析したいデータに関連していることがわかりました。次のように出力をテストしようとすると

a
b
c
d
e

その後、grep -vf file.txta、b、cを削除すると、魅力のように動作します。さまざまな特殊文字を含む複数のWebサイトを無視しようとしているため、SQLクエリの出力.txtファイルを操作しようとすると機能しません。

最終的にコマンドを読みやすくする解決策は、バックスラッシュ(\)を使用してコマンドを複数行に分割して読みやすくすることでした。

sqlite3 /home/me/HistoryDatabaseFile.db "select * from urls order by url;" | \
grep -v safesite1.com | \
grep -v safesite2.com | \
grep -v safesite3.com | \
grep -v safesite4.com | \
grep -v safesite5.com

助けてくれてありがとう!

関連情報