2016-07-07 96 views
3

使用grep,可以打印与您的搜索查询匹配的行。添加-C选项将打印周围上下文的两行,这样的:使用grep仅打印上下文

> grep -C 2 'lorem' 
some context 
some other context 
**lorem ipsum** 
another line 
yet another line 

类似地,可以使用grep -B 2grep -A 2打印匹配的行与两个前面的或两个以下行,分别,例如:

> grep -A 2 'lorem' 
**lorem ipsum** 
another line 
yet another line 

是否可以跳过匹配行并仅打印上下文?具体来说,我想只能打印这正是2行以上的匹配行,像这样:

> <some magic command> 
some context 
+0

不在我所知道的'grep'中。使用'awk'就像这样:[用sed或awk打印一行符合匹配模式](http://stackoverflow.com/a/17914105/1983854) – fedorqui

+0

@fedorqui这适用于以下行,但我可以修改它获得前面的几行?以前从未使用过awk。 – rrrafalsz

+1

使用'tac'向后打印文件。 – fedorqui

回答

3

如果你能允许使用夫妇grep情况下,你可以尝试像我在提到评论部分。

$ grep -v "lorem" < <(grep -A2 "lorem" file) 
another line 
yet another line 

$ grep -A2 "lorem" file | grep -v "lorem" 
another line 
yet another line 

如果你有兴趣在一个剂量的awk,有一个很酷的方式做到这一点作为

$ awk -v count=2 '{a[++i]=$0;}/lorem/{for(j=NR-count;j<NR;j++)print a[j];}' file 
another line 
yet another line 

它通过储存在自己的数组整个文件并搜索模式后lorem,存储行号的awk特殊变量(NR)指向找到该模式的确切行。如果我们在awk变量-v count指定的前面循环2行,我们可以打印所需的行。

如果您对打印图案感兴趣,只需将for循环中的条件更改为j<=NR而不是j<NR即可。而已!

0

纯粹通过grep命令无法完成此操作。如果文本中只有一个lorem实例,则可以通过head管道输出。

grep -B2 lorem t | head -1 

如果有可能的lorem多次出现,你可以使用awk

awk '{second_previous=previous; previous=current_line; current_line=$0}; /lorem/ { print second_previous; }' 

此awk命令变量保存每行(与以前在那之前的一个沿),所以当它遇到包含lorem的行,它会打印第二行。如果lorem恰好发生在输入的第一行或第二行,则不会打印任何内容。