-1

Apache ログから電子メール アドレスを抽出しようとしていますが、awk または grep でうまくいきました。

私は下に疲れましたが、完全に失われました

awk  -va="/folder/new/" -vb="_home" 'a {flag=1;next} b {flag=0} flag { print }'

ログ行の例:

1.2.5.6 - - [01/Aug/2012:16:53:29 +0100] "GET /folder/new/user@example.com_home/some/rubbish/here/ "https://www.website.com/home.php" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.)"

理想的には、以下のような出力が必要です

user@exmaple.com using MSIE 7.0 on Windows NT 5.1

すべての助けに感謝します

ありがとう

4

3 に答える 3

1

データの変動性に応じて、関連するフィールド セパレータを指定することでこれを行うことができます。

awk -F '[/_()]' '{ print $6, $(NF-1) }' log

出力:

user@example.com compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.
于 2012-08-22T11:27:11.350 に答える
0

bashで正規表現を使用できます

regex='/folder/new(.*)_home.*"compatible; (.*); (.*);.*"'
[[ $logStr =~ $regex ]]
user="${BASH_REMATCH[1]}"
browser="${BASH_REMATCH[2]}"
os="${BASH_REMATCH[3]}"

echo "$user using $browser on $os"

正規表現が完全に正しいかどうかはわかりません。ログメッセージに表示される、保証されていない固定文字列について、いくつかの仮定を立てた可能性があります。しかし、うまくいけば、このアプローチに興味があれば、ここで始めるのに十分です。

于 2012-08-22T12:53:02.123 に答える
0

これを試して:

grep "@" apache.log | sed -r 's,.*/folder/new/([^@]+@.*)_home.*"([^"]*)"$,\1 using \2,'

「/folder/new/」と「_home」は常にこのように表示されると想定しています。

これは、GNU sed バージョン 4.2.1 を使用してラインでテストされました。

于 2012-08-22T11:54:58.683 に答える