grep表示多行字符串,但只打印字符串而不是整行

时间:2015-04-07 09:31:30

标签: regex bash grep

我正在编写一个脚本来读取日志文件并从每行中提取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的各种组合,但是我不知道如何只使用我想要的字符串,连接输出然后打印到文件。

实现这一目标的最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

在您的日志中,%v可以轻松匹配为每个字符串中的第二个字,您可以放置​​以下模式:

^\S+\s(\S+)

为您提供虚拟主机作为第一个捕获的组。时间戳包含在方括号内,因此可以与:

匹配
\[([^\]]+)\]

仅保留要匹配的用户代理字符串。用户代理是日志中的最后一个字符串,用双引号括起来;使用$占位符:

"([^"]+)"$

现在,结合3个子模式:

^\S+\s(\S+).*?\[([^\]]+)\].*"([^"]+)"$