匹配模式并在条件匹配时打印第n行

时间:2013-11-26 18:43:54

标签: shell awk

我的要求是这样的:

Read File:
If ( line contains /String1/)
{
  Increment cursor by 10 lines;
  If (line contains /String2/ )
  {   print line; }
}
到目前为止,我得到了:

awk '/String1/{nr[NR]; nr[NR+10]}; NR in nr' file1.log

结果应输入:

awk 'match ($0 , /String2/) {print $0}' file1.log

我怎样才能实现它?有没有更好的办法? 感谢。

2 个答案:

答案 0 :(得分:2)

你很亲密;你需要设置数组元素的值。

awk '/String1/ { linematch[NR+10]=1; } /String2/ && NR in linematch;' file1.log

每次一行与String1匹配时,您保存记录(行号)加10.每当您匹配String2时,检查当前行号是否是我们期望的行号,如果是,打印线。

答案 1 :(得分:2)

这是描述算法的另一种方法。而不是:

If ( line contains /String1/)
{
  Increment cursor by 10 lines;
  If (line contains /String2/ )
  {   print line; }
}

这需要以某种方式在输入流中向前跳,将其视为:

If ( line contains /String2/)
{
  If (line 10 lines previously contained /String1/ )
  {   print line; }
}

只需要您重新访问已阅读的内容:

awk '/String1/{f[NR]} /String2/ && (NR-10) in f' file