我在 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 过滤掉不需要的单词。