使用-A选项

时间:2016-08-11 11:34:34

标签: grep

我想问一下是否有可能将-v与-A结合起来?

我有示例文件:

abc
1
2
3
ACB
def
abc
1
2
3
ABC
xyz

用-A我可以看到我想要的部分" cut":

$ grep abc -A 4 grep_v_test.txt
abc
1
2
3
ACB
--
abc
1
2
3
ABC

它有一些选项来指定只能看到的东西

def
xyz

我找到了这个答案 - Combining -v flag and -A flag in grep,但它不适合我,我试过

$ sed -e "/abc/{2;2;d}" grep_v_test.txt
sed: -e expression #1, char 8: unknown command: `;'

$ sed "/abc/2d" grep_v_test.txt
sed: -e expression #1, char 6: unknown command: `2'

$ sed "/abc/+2d" grep_v_test.txt
sed: -e expression #1, char 6: unknown command: `+'

Sed版本是:

$ sed --version
GNU sed version 4.2.1

EDIT1: 根据评论,我对这两种解决方案进行了一些实验,但它并没有像我想的那样工作

对于grep -v -A 1 abc我希望删除行abc和1,但其余的将被打印awk 'c&&!--c; /abc/ {c=2}' grep_v_test.txt只打印包含2的行,这不是我想要的。

与sed非常相似

$ sed -n '/abc/{n;n;p}' grep_v_test.txt
2
2

EDIT2: 看来,我无法正确描述它,让我再试一次。

grep -A N abc file做的是在abc之后打印N行。我想删除grep -A将显示的内容,因此在文件中

abc
1
2
3
ACB
def
DEF
abc
1
2
3
ABC
xyz
XYZ

我只是将部分abc删除到ABC,然后打印其余部分:

<击> ABC
1
2
3
ACB
DEF
DEF
<击> ABC
1
2
3
ABC
XYZ
XYZ

所以剩下4行... awk解决方案只打印def和xyz并跳过DEF和XYZ ......

2 个答案:

答案 0 :(得分:2)

如果我理解正确,你想打印在给定匹配后出现4行的所有行。

为此,您可以在Extract Nth line after matching pattern中调整解决方案并说:

$ awk '/abc/ {c=0} c++>4' file
def
DEF
xyz
XYZ

答案 1 :(得分:2)

要跳过从初始匹配行开始的5行上下文:

$ awk '/abc/{c=5} c&&c--{next} 1' file
def
xyz

有关其他相关脚本,请参阅Extract Nth line after matching pattern

下面的评论,这是这个答案和@fedorqui's answer之间的区别:

$ cat file
now is the Winter
of our discontent
abc
1
2
bar

$ awk '/abc/{c=3} c&&c--{next} 1' file
now is the Winter
of our discontent
bar

$ awk '/abc/ {c=0} c++>2' file
bar

看看@ fedorqui的脚本如何无条件地跳过文件的前两行?