如何让'grep'在grepped线上方显示一行五行?

时间:2011-06-08 15:29:58

标签: file grep

我已经看过一些前后点击线的例子,但是我想忽略中间线。 所以,我之前想要五行,但没有别的。 可以这样做吗?

4 个答案:

答案 0 :(得分:29)

好的,我认为这会做你想要的。它将寻找一个模式,并在每场比赛前提取第5行。

grep -B5 "pattern" filename | awk -F '\n' 'ln ~ /^$/ { ln = "matched"; print $1 } $1 ~ /^--$/ { ln = "" }'

这基本上是如何工作的,它需要第一行,打印它,然后等到它看到^--$(grep使用的匹配分隔符),然后重新开始。

答案 1 :(得分:10)

这是选项-B

   -B NUM, --before-context=NUM
    Print  NUM  lines  of  leading  context  before  matching lines.
    Places  a  line  containing  --  between  contiguous  groups  of
    matches.

答案 2 :(得分:7)

如果你只想在比赛前获得第5行,你可以这样做:

grep -B 5 pattern file | head -1

编辑:
如果您可以有多个匹配项,则可以尝试此操作(与实际模式交换pattern):

sed -n '/pattern/!{H;x;s/^.*\n\(.*\n.*\n.*\n.*\n.*\)$/\1/;x};/pattern/{x;s/^\([^\n]*\).*$/\1/;p}' file

我是从Sed tutorial部分:Keeping more than one line in the hold buffer,示例2中获取此内容并对其进行了调整。

答案 3 :(得分:2)

这种方式对我来说更容易:

...
<% form_for [resource_name, resource.with_pessoa], :url => registration_path(resource_name) do |f| %>
...
  <% f.fields_for :pessoa do |pessoa_form| %>
  ...
  <% end %>

在包含模式之前,包括5行,关闭---组分隔符,然后每隔5行打印一次。