-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

试试这个:

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 回答
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 回答