grep a file, but show several surrounding lines?
我想用
对于bsd或gnu
1 | grep -B 3 -A 2 foo README.txt |
如果您希望前后的行数相同,可以使用
1 | grep -C 3 foo README.txt |
这将显示前面的3行和后面的3行。
ACK使用与grep类似的参数,并接受
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的手册页,因为你可以用它做很多事情。
1 | man grep |
许多GNU工具也有一个信息页,除了手册页之外,它可能还有更有用的信息。
1 | info grep |
在/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 |
如果您关心性能,请使用与
1 | rg -C5"pattern" . |
-C ,--context NUM - Show NUM lines before and after each match.
还有参数,如
这个工具是建立在Rust的Regex引擎之上的,这使得它在大数据上非常有效。
grep有一个名为
1 | | grep -C 5 |
或
1 | | grep -5 |
应该做这个把戏
1 | $grep thestring thefile -5 |
-5表示在匹配项的上下各5行"theString"等于-c 5或-A 5 -B 5
这是
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 |
注:用前后行数替换
对于不支持grep的