我想用grep来表示一个字符串,同时也显示前面的五行和后面的五行以及匹配的行。我怎样才能做到这一点?
- 为此,我保留了BrendanGregg的Perl脚本的副本。很好用。
- 对于在Solaris上工作的解决方案,请查看此链接。
- man grep | grep -C 1 context。
- (1)
- @ StvnW…我不知道是否要称之为meta(在更一般的情况下,而不是上下文中),或者称之为什么。你通过演示如何使用答案来找到答案来回答问题。
- 也许StackExchange的其他人可以给我们一个答案。
对于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行。
- 这很好,但不幸的是,Solaris grep不支持这一点。请参见solaris的链接:unix.com/solaris/33533 grep在.h‌&8203;tml之后显示几行
- 好的,但是如果想在匹配之后显示所有的输出行呢?grep-a0和grep-a-1不要剪…
- 拉夫普:我相信还有Gnugrep
- 虽然在我的手册中提到过,但由于某种原因,我不工作。
- 如果您是HP-UX env,那么grep版本都不会像在Solaris中那样工作。可以使用Solaris链接,但在该链接中用awk替换nawk。
- -n表示行号,但对于某些版本的grep-n将显示带有行号的环绕行(如-c)。当我需要上下文时,这是一个有用的快捷方式。
- @G33KZ0R,在这种情况下,你应该单独问一个问题。(即使有人在这里费劲回答你,我也不明白为什么…)
- Solaris grep不支持此功能。但是GNUgrep支持Solaris。
- 这也适用于"bash on ubunutu on windows"!从本文开始,Windows Linux子系统使用Ubuntu 14.04.4 LTS。
- grep -为我工作。
- @g33kz0r在文件上执行wc-l,并将其设为-a值。然后你知道它会在比赛后显示你文件中的所有行
-A和-B将起作用,-C n将起作用(对于n行上下文),或只是-n行上下文…只要n是1到9)。
- +1--5比-A 5 -B 5打字快。
- 我试用了-n格式,发现它只在9之前有效。对于15它返回5行
- @Deepakmahakale这可能与POSIX程序通常如何解析命令行参数/选项有关。选项说明符是单个字符(如-A、-B或-C)。通常,选项说明符后面跟着一个值(-o a.out在gcc中指定输出文件),但它也可以作为一个简单的开关/标志(-g在gcc中启用调试信息)。然而,期权之间的空格是可选的,因此对于没有价值的期权,可以合并它们(-ABC,这意味着-15被解释为-1 -5(两个单独的期权),-5取代-1。
ACK使用与grep类似的参数,并接受-C。但通常最好是通过代码进行搜索。
- ACK还支持-A-B。
- ACK在很多方面都比GREP好。它的速度更快,语法更简单。
- 不过,grep的优点是在许多系统上默认安装。
- @Marcz:是的,grep在默认情况下比ack更容易安装,但ack是一个可移植的独立脚本。不需要编译它或将它安装在系统目录中,如/usr/bin/。一旦它被下载并放置到$path(及其执行权限位集)中列出的目录中,它就可以立即工作。(无需sudo或root权限即可恢复工作。)
1
| grep astring myfile -A 5 -B 5 |
这将使"myfile"变为"astring",并在每次比赛前后显示5行
- "grep astring myfile-c 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 |
- 你没有读过被接受的答案吗?你只是在重复一个差不多10岁的问题上已经说过的话…
- 哦,对不起,尤凯。但是我没有读到任何关于grep的帮助部分来检索答案的内容。
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参数的系统尤其有用。