Sed Ruby on Rails日志文件的多行正则表达式

Sed Ruby on Rails日志文件的多行正则表达式,sed,Sed,我使用的是Ruby on Rails日志文件,该文件类似于以下示例: [...] Started GET "/staff/sign_in" for 22.22.22.22 at 2014-02-16 03:39:32 -0800 Processing by Staffer::SessionsController#new as */* Rendered layouts/_compatible_browsers.html.erb (0.9ms) Rendered layouts/header

我使用的是Ruby on Rails日志文件,该文件类似于以下示例:

[...]
Started GET "/staff/sign_in" for 22.22.22.22 at 2014-02-16 03:39:32 -0800
Processing by Staffer::SessionsController#new as */*
  Rendered layouts/_compatible_browsers.html.erb (0.9ms)
  Rendered layouts/headers/_guest.html.erb (0.6ms)
Cache digest for layouts/social_media_footer_link.html: bc9b2db49cc435f550be0f0dffe79548
Cache digest for layouts/_footer.html: 87dcaa136f1edad80dd5eb5a4b5dde82
Read fragment views/staffer_footer/87dcaa136f1edad80dd5eb5a4b5dde82/87dcaa136f1edad80dd5eb5a4b5dde82 (4.6ms)
  Rendered layouts/_footer.html.erb (7.4ms)
Completed 200 OK in 527ms (Views: 445.2ms | ActiveRecord: 1.0ms)
Started GET "/staff/sign_in" for 22.22.22.22 at 2014-02-16 03:49:32 -0800
Started GET "/staff/sign_in" for 22.22.22.22 at 2014-02-16 03:59:32 -0800
Processing by Staffer::SessionsController#new as */*
  Rendered layouts/_compatible_browsers.html.erb (0.9ms)
  Rendered layouts/headers/_guest.html.erb (0.6ms)
Cache digest for layouts/social_media_footer_link.html: bc9b2db49cc435f550be0f0dffe79548
Read fragment views/staffer_footer/87dcaa136f1edad80dd5eb5a4b5dde82/87dcaa136f1edad80dd5eb5a4b5dde82 (4.6ms)
  Rendered layouts/_footer.html.erb (7.4ms)
Completed 200 OK in 527ms (Views: 445.2ms | ActiveRecord: 1.0ms)
[...]
我如何告诉
sed
为给定示例提供以下输出

Started GET "/staff/sign_in" for 22.22.22.22 at 2014-02-16 03:39:32 -0800; Completed 200 OK in 527ms (Views: 445.2ms | ActiveRecord: 1.0ms)
Started GET "/staff/sign_in" for 22.22.22.22 at 2014-02-16 03:59:32 -0800; Completed 200 OK in 527ms (Views: 445.2ms | ActiveRecord: 1.0ms)
这可能适用于您(GNU-sed):

更好的语法:

sed -n '/Started GET/{h;d;};/Completed 200 OK/{H;g;s/\n/; /p;}' file

我想这更像是grep的例子
grep“^Started”^Completed”文件
,然后删除新行。在一些有线场景中,我使用
grep
获得两行
Started
。我想这更像是sed的工作。但是我不是100%确定。
sed
用于
流编辑器,用于过滤和转换文本
,而
grep
用于
打印与模式匹配的行
。考虑到您的示例输入,对我来说,使用
grep
更有意义,但请使用更具代表性的输入进行更新,以便我们可以一起猜测什么是最好的。我改进了示例。现在有3个GET,但结果应该只包含2个GET。有没有办法知道哪个开始了,哪个完成了?+1;在OSX上完成这项工作所需要的就是用
终止每个
{…}
块中的最后一个命令太:
sed-n'/startedget/{h;d;}/已完成200个OK/{H;g;s/\n/;/p;}文件
sed -n '/Started GET/{h;d;};/Completed 200 OK/{H;g;s/\n/; /p;}' file