我正在编写一个脚本来读取日志文件并从每行中提取3个字符串(前提是它们匹配)然后打印到外部文件,可能是CSV或类似文件。
每个日志行的格式都在组合的Apache访问输出中,如下所示:
%D %v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"
示例:
1550606 *user1.testdomain.com* 100.100.100.100 - - *[07/Apr/2015:09:12:48 +0000]* "GET /TestURI HTTP/1.1" 200 11917 "-" *"Test User Agent"*
我想要提取的3个字符串是虚拟主机(%v),时间戳(%t)和用户代理(%{User-Agent }ⅰ)
我已经尝试了grep和sed的各种组合,但是我不知道如何只使用我想要的字符串,连接输出然后打印到文件。
实现这一目标的最佳做法是什么?
答案 0 :(得分:0)
在您的日志中,%v
可以轻松匹配为每个字符串中的第二个字,您可以放置以下模式:
^\S+\s(\S+)
为您提供虚拟主机作为第一个捕获的组。时间戳包含在方括号内,因此可以与:
匹配\[([^\]]+)\]
仅保留要匹配的用户代理字符串。用户代理是日志中的最后一个字符串,用双引号括起来;使用$
占位符:
"([^"]+)"$
现在,结合3个子模式:
^\S+\s(\S+).*?\[([^\]]+)\].*"([^"]+)"$