将grep的-v选项与-A选项组合

将grep的-v选项与-A选项组合,grep,Grep,我想问一下,有没有可能以某种方式将-v与-A结合起来 我有一个示例文件: abc 1 2 3 ACB def abc 1 2 3 ABC xyz 使用-A,我可以看到我想要“切割”的部分: 它提供了一些选项来指定仅可查看的内容 def xyz ? 我找到了这个答案——但它对我不起作用,我试过了 $ sed -e "/abc/{2;2;d}" grep_v_test.txt sed: -e expression #1, char 8: unknown command: `;' 也 或 Sed

我想问一下,有没有可能以某种方式将-v与-A结合起来

我有一个示例文件:

abc
1
2
3
ACB
def
abc
1
2
3
ABC
xyz
使用-A,我可以看到我想要“切割”的部分:

它提供了一些选项来指定仅可查看的内容

def
xyz
?

我找到了这个答案——但它对我不起作用,我试过了

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

Sed版本为:

$ sed --version
GNU sed version 4.2.1
edit1: 根据评论,我对这两种解决方案都做了一点试验,但并没有达到我想要的效果

对于
grep-v-a1abc
我希望行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-abc文件的作用是在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…

如果我理解正确,您希望打印给定匹配后4行出现的所有行

为此,您可以调整中的解决方案,并说:


如果我理解正确,您希望打印给定匹配后4行出现的所有行

为此,您可以调整中的解决方案,并说:


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

$ awk '/abc/{c=5} c&&c--{next} 1' file
def
xyz
有关其他相关脚本,请参阅

在下面的评论中,这里是这个答案和以下的区别:


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

要跳过从初始匹配行开始的5行上下文,请执行以下操作:

$ awk '/abc/{c=5} c&&c--{next} 1' file
def
xyz
有关其他相关脚本,请参阅

在下面的评论中,这里是这个答案和以下的区别:



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

只需使用
awk
--->
awk'c&--c/abc/{c=5}'文件
谢谢你的回答,它工作得很好,但我仍然想知道使用sed的答案(与awk相比,我是该文件的一个更大的朋友)。然后使用sed-n/abc/{n;n;n;n;n;n;p}文件
。现在我更好地理解了前面的示例,但这并不是真正的grep-v工作方式,它不是打印不匹配的行…我提到的两个行都是这样做的:将一行内容与“abc”匹配,然后打印它后面的第五行。只需使用
awk
-->
awk'c&--c/abc/{c=5}'文件
谢谢你的回答,它工作得很好,但我仍然想知道使用sed的答案(与awk相比,我是该文件的一个更大的朋友)。然后使用sed-n/abc/{n;n;n;n;n;n;p}文件。现在我更好地理解了前面的示例,但这并不是真正的grep-v工作方式,这不是打印不匹配的行…我提到的两个行都是这样做的:将一行内容与“abc”匹配,然后打印后面的第五行。谢谢,这似乎正是我想要的,但正如我所说,我不是awk的大朋友。。。当我现在看到它时,它看起来非常简单…@Betlista你可以尝试在
sed
中编写它,但它可能会变得疯狂,因为它是一个逐行处理事情的工具。我更喜欢
awk
,因为在处理文件时考虑所有上下文是很好的。而且它也很整洁:)我已经喜欢你的解决方案了。我想要一个像grep一样简单的东西,用/wothout-v检查,然后从
c++>4
改为
c++只做你想做的事情,因为
abc
发生在文件的开头。如果没有,那么该命令将跳过前5行。@Betlista是的,Ed的解决方案涵盖了所有情况。谢谢,这似乎正是我想要的,但正如我所说,我与awk不是那么好的朋友。。。当我现在看到它时,它看起来非常简单…@Betlista你可以尝试在
sed
中编写它,但它可能会变得疯狂,因为它是一个逐行处理事情的工具。我更喜欢
awk
,因为在处理文件时考虑所有上下文是很好的。而且它也很整洁:)我已经喜欢你的解决方案了。我想要一个像grep一样简单的东西,用/wothout-v检查,然后从
c++>4
改为
c++只做你想做的事情,因为
abc
发生在文件的开头。如果没有,那么该命令将跳过前5行。@Betlista是的,Ed的解决方案涵盖了所有情况。我不清楚有什么区别。当我更改文件“abc”->“xabc”的内容并使用它工作的相同命令时,您的语句“它只做您想要的事情,因为abc发生在文件的开头”似乎是不正确的。我不清楚(也在链接页上)这个
1
{next}
是用来做什么的…当您将
abc
更改为
x abc
时,并没有改变
abc
发生在文件开头的事实-您没有从第一行删除
abc
,你刚刚在同一行上添加了其他内容。试着在当前的第一行之前放一个全新的行,比如
foo
1
是一种真实情况,它会导致出现打印当前记录的默认操作,这是一种极为常见的awk习惯用法
next
告诉awk停止处理当前记录。如果你打算进行任何文本操作,我推荐阿诺德·罗宾斯的《有效的Awk编程》第四版。@Betlista我编辑了我的答案,以包括一个示例,向你展示这两个脚本之间的区别。我不清楚这两个脚本的区别是什么
abc
1
2
3
ACB
def
DEF
abc
1
2
3
ABC
xyz
XYZ
$ awk '/abc/ {c=0} c++>4' file
def
DEF
xyz
XYZ
$ awk '/abc/{c=5} c&&c--{next} 1' file
def
xyz
$ 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