将grep的-v选项与-A选项组合
我想问一下,有没有可能以某种方式将-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
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