我想用grep来表示一个字符串,同时也显示前面的五行和后面的五行以及匹配的行。我怎样才能做到这一点?
对于bsd或gnu grep,您可以使用-B num来设置匹配前的行数,使用-A num来设置匹配后的行数。
1
| grep -B 3 -A 2 foo README.txt |
如果您希望前后的行数相同,可以使用-C num。
1
| grep -C 3 foo README.txt |
这将显示前面的3行和后面的3行。
-A和-B将起作用,-C n将起作用(对于n行上下文),或只是-n行上下文…只要n是1到9)。
ACK使用与grep类似的参数,并接受-C。但通常最好是通过代码进行搜索。
1
| grep astring myfile -A 5 -B 5 |
这将使"myfile"变为"astring",并在每次比赛前后显示5行
我通常使用
1
| grep searchstring file -C n # n for number of lines of context up and down |
许多像grep这样的工具也有非常棒的man文件。我发现自己经常提到grep的手册页,因为你可以用它做很多事情。
许多GNU工具也有一个信息页,除了手册页之外,它可能还有更有用的信息。
在/some/file.txt"中搜索"17655",显示前后10行上下文(使用awk),输出前面是行号,后面是冒号。当"grep"不支持"-[acb]"选项时,在Solaris上使用此选项。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| awk '
/17655/ {
for (i = (b + 1) % 10; i != b; i = (i + 1) % 10) {
print before[i]
}
print (NR":" ($0))
a = 10
}
a-- > 0 {
print (NR":" ($0))
}
{
before[b] = (NR":" ($0))
b = (b + 1) % 10
}' /some/file.txt; |
使用GRIP
1 2 3 4 5 6
| $ grep --help | grep -i context
Context control:
-B, --before-context=NUM print NUM lines of leading context
-A, --after-context=NUM print NUM lines of trailing context
-C, --context=NUM print NUM lines of output context
-NUM same as --context=NUM |
ripgrep如果您关心性能,请使用与grep语法类似的ripgrep,例如。
-C, --context NUM - Show NUM lines before and after each match.
还有参数,如-A/--after-context和-B/--before-context。
这个工具是建立在Rust的Regex引擎之上的,这使得它在大数据上非常有效。
grep有一个名为Context Line Control的选项,您可以使用--contect,简单地说,
或
应该做这个把戏
1
| $grep thestring thefile -5 |
-5表示在匹配项的上下各5行"theString"等于-c 5或-A 5 -B 5
这是awk中的@ygor解决方案
1
| 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=3 a=3 s="pattern" myfile |
注:用前后行数替换a和b变量。
对于不支持grep的-A、-B和-C参数的系统尤其有用。