如何grep一个文件并输出一行的匹配部分加上几个周围的单词?

时间:2014-03-14 01:30:35

标签: linux bash sed awk grep

我正在搜索某个模式的文件,并希望限制输出,使其不显示整行,而是由几个单词包围的匹配,所以我可以看到上下文。线条太长,无法在输出中舒适地查看整条线。我正在寻找使用grep,awk和/或sed的解决方案。 grep有-o选项,如果我有正确的正则表达式,也可以使用它。

作为一项额外功能,如果解决方案可选择支持grep的行号功能,那么可以在需要时随行输出行号。

更新
这是一个测试文件:

1 2 3 4 5 abc 1 2 3 4
abc
1 2 abc
abc 1
1 abc 1
1 2 3 abc 1 2 3
1 2 3 4 abc 1
1 2 3 4 5 6
1 2 3 4 5
1 2 3
1

SOLUTION:

将最小单词数更改为零,这样我们就不会错过任何单词所包含的关键字匹配项:

egrep -no '(\w+ ){0,3}keyword( \w+){0,2}' file

示例:

egrep -no '(\w+ ){0,3}abc( \w+){0,2}' test.txt

输出:

1:3 4 5 abc 1 2
2:abc
3:1 2 abc
4:abc 1
5:1 abc 1
6:1 2 3 abc 1 2
7:2 3 4 abc 1

1 个答案:

答案 0 :(得分:3)

我相信你正在寻找类似的东西:

egrep -no '(\w+ ){1,3}keyword( \w+){1,2}' file

这将打印包含单词'keyword'的行,并带有行号前缀。它将在比赛前最多打印三个单词,在比赛后最多打印两个单词。

\w将匹配归类为“字”字符(字母数字或_)的任何单个字符。

这个答案还假设单词空格分隔的单词。