セキュリティタスクの一環として、私は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
リストを提供する必要がありますgrep
。grep
しかし、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.txt
a、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
助けてくれてありがとう!