在模式匹配之前和之后打印一些行,排除与其他模式匹配的行

在模式匹配之前和之后打印一些行,排除与其他模式匹配的行

我在 Solaris 上使用 awk 在模式匹配之前和之后打印 5 行。目前,以下单行代码可以完成这项工作:

/usr/xpg4/bin/awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=5 a=5 s="ERROR" file

然而,结果并不令人满意。首先,它包含不需要的行,例如

  • 与比赛本身相关的线条
  • 空行
  • 与(不需要的)模式匹配的行,例如
    • 消除
    • 废话
    • 愚蠢的

此外,还要求每个基础都应该用带有一些破折号的线分隔。

输入示例:

stupid
remove

keep it
*
MATCH
keep it as well



remove

important
                                                     *
MATCH at line 2:
needed
also

this line should be kept
                                                     *
MATCH at line 2:
this to save
very important



remove

keep it
*
MATCH
keep it as well

nonsense
another nonsense

预期输出:

keep it
keep it as well
---
important
needed
also
---
this line should be kept
this to save
very important
---
keep it
keep it as well

如何以一种可能优雅的方式实现它?

答案1

虽然预期的输出尚不清楚,但我会尝试。如果您在 Solaris 上有 gnu utils,则可以以非常简单的方式使用 gawk 和 ggrep:

gawk 'NF > 0' fileName  |ggrep -C5 pattern

您可以添加一个 |最后的 ggrep -v somePattern 过滤掉不需要的单词。

相关内容