昨年、すべてのApacheログを調べ、特定のPHPページ(foobar.php)が外部IPアドレスからアクセスされたかどうかを調べる必要があります。Linuxサーバで正規表現を使用して "find"を使用する
したがって、すべてのLAN IP(192.168.x.x)からの訪問を除外し、foobar.phpを含むApache .logとlog.gzファイルのすべての行を見つける必要があります。
grepコマンドを実行すると検索できますか?
昨年、すべてのApacheログを調べ、特定のPHPページ(foobar.php)が外部IPアドレスからアクセスされたかどうかを調べる必要があります。Linuxサーバで正規表現を使用して "find"を使用する
したがって、すべてのLAN IP(192.168.x.x)からの訪問を除外し、foobar.phpを含むApache .logとlog.gzファイルのすべての行を見つける必要があります。
grepコマンドを実行すると検索できますか?
:@EdMortonはコメントで指摘したように、awk
は私たちが使用するためのより良いツールかもしれません動作するはずです:
zgrep -v '^192\.168\.' access.log* | grep '/foobar\.php'
興味深いことに、最初に否定的なgrepを実行すると、私は直観的なことがまずfoobarのgrepになると思っていました。 50行にfoobarが含まれ、50行に500行のファイルがあり、50行にはIPが含まれています.1行で1000行、2行目で950行(つまり1950行が検索されます)それを逆にした場合、2番目のgrepは50行だけを検索します(つまり、合計1050行が検索されます)。 –
@EdMortonこのようにすることのポイントは、行頭にアンカーされた '^ 192 \ .168 \ .'にマッチすることができます。あなたの周りの別の方法は 'access.log.3.gz'と同じくらい簡単かもしれないし、そうでないかもしれないファイル名(最初の' grep'によって作成された)をスキップする必要があります。 _shrug_ –
これらの2つのコマンドは、すべての非圧縮と圧縮されたApacheのアクセスログに/mypage.php
を検索する必要があります
grep '/mypage\.php' access.log access.log.[0-9] | grep -v '192\.168\.[0-9.]\+'
zcat access.log*.gz | grep '/mypage\.php' | grep -v '192\.168\.[0-9.]\+'
grep -v
は192\.168\.[0-9.]*
のための正規表現マッチを否定。 zcat
は、gzip圧縮ファイルの場合はcat
です。
編集:あなたのログは、共通ログ形式(CLF)、このようなものであると仮定すると、
awk '/\/mypage\.php/ && !/192\.168\.[0-9.]+/' access.log access.log.[0-9]
zcat access.log*.gz | awk '/\/mypage\.php/ && !/192\.168\.[0-9.]+/'
大きなポイント;これを編集で追加しました。ありがとう! :)はい、私は '+'を意味しました。 – Will
あなたのアイデアをありがとう、ありがとう、私はこの2つが好きですが、それはちょうど小さいので、私は最初の答えを受け入れました。ありがとうございました。 – user164863
恐ろしいですが、問題ありません。私はあなたが受け入れた答えも好きです。私は、zgrepが非gzip形式のファイルで動作していることに気付かなかった! – Will
を(未テスト)このようなものは、それを行う必要があります。
find dir_where_logs_are -type f \(-name '*.log' -o -name '*.log.gz' \) -print |
while IFS= read -r file
do
case $file in
*.gz) zgrep 'mypage\.php' "$file" ;;
*) grep 'mypage\.php' "$file" ;;
esac
done |
grep -E -v '192\.168\.[0-9]+\.[0-9]+'
を
上記はファイル名に改行がないことを前提としています。
あなたのアイデアをありがとう、ありがとう、私はこの2つが好きです、しかし、私は最初の答えを受け入れましたが、それはちょうど小さいので。ありがとうございました。 – user164863
あなたはこれまでに何を試していますか? –
私は、検索された行は2つの改行の間になければならないことを理解しています。foobar.phpを含んでいて、ローカルアドレスを含んでいないはずです。find -type f -exec grep -regex "[\/"¥?n¥?(*。* foobar¥.php *)(?!。* 192¥.168¥。*)¥/ r¥/ n】" – user164863
ログファイルの行を追加すると良いでしょう。質問に。 – Shafizadeh