我想问一下是否有可能将-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 ......
答案 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的脚本如何无条件地跳过文件的前两行?