Unix 在n个块之间使用sed命令获取行

Unix 在n个块之间使用sed命令获取行,unix,sed,awk,Unix,Sed,Awk,我有n个块,如critical---end1和warning end2如下所示: zczdczdczd zdfzdfdf zdfzdfzd zdfzdf zdfzdf critical abc def ghi end1 zdfzd zdfzddf warning abs def ghi end2 zdfzdfzd zdfzdfz zdfdfz critical abc def ghi end1 zdfzdfzdf zdfzddzf critical asdasd asdasd a

我有n个块,如
critical---end1
warning end2
如下所示:

zczdczdczd
zdfzdfdf
zdfzdfzd
zdfzdf
zdfzdf


critical
abc
def
ghi
end1

zdfzd
zdfzddf

warning
abs
def
ghi
end2

zdfzdfzd
zdfzdfz
zdfdfz

critical
abc
def
ghi
end1

zdfzdfzdf
zdfzddzf

critical
asdasd
asdasd
asdasd
end1

asda
asdasd
asdasd

warning
asdas
asdasd
asdasd
end2

asdas
asdasd

warning
asdasd
asdasda
asdas
end1
我只需使用
sed
awk

将所有的块
临界--end1
警告--end2
进行grep,其中一些类似:

awk -v RS= '(/critical/ && /end1/) || (/warning/ && /end2/)' file
critical
abc
def
ghi
end1
warning
abs
def
ghi
end2
critical
abc
def
ghi
end1
critical
asdasd
asdasd
asdasd
end1
warning
asdas
asdasd
asdasd
end2

这里是另一个
awk
。此版本不关心数据是否在块中,并保留间距

awk '/critical/ {f="c";next} /warning/ {f="w";next} (/end1/&&f=="c")||(/end2/&&f=="w") {print d;d=f=""} f {d=$0?d"\n"$0:$0}' t

abc
def
ghi

abs
def
ghi

abc
def
ghi

asdasd
asdasd
asdasd

asdas
asdasd
asdasd

要将数据获取到单独的文件,请执行以下操作:

awk '/critical/ {f="c";next} /warning/ {f="w";next} /end1/&&f=="c" {print d > "critical";d=f=""} /end2/&&f=="w" {print d > "warning";d=f=""} f {d=$0?d"\n"$0:$0}' file
这会将数据保存到两个文件中
critial
warning

sed -n '/^critical$/,/^end1$/p; /^warning$/,/^end2$/p' file |
grep -v -e '^critical$' -e '^warning$' -e '^end[12]$'
-n
告诉
sed
默认情况下不要打印所有行,另外两个命令是使用
p
命令打印第一个和第二个地址之间所有行的范围


ETA:要想漏掉定界线,最简单的方法是用
grep-v
去掉它们,它只打印与给定图案不匹配的线。

可能重复的已删除线,我不知道如何对齐。哦,我明白了。您能否尝试指出所需的输出以及您尝试的内容?注意:您可以使用编辑栏中的
{}
按钮格式化文本。谢谢您,先生。请帮助我了解我的要求。如果有一个以
critical
开头,以
end2
结尾的部分,这将打印它。它将打印以
warning
开头,以
end1
结尾的部分,示例的最后一节。嗨,我不想只在该块中的内容中显示critical和end1 i nedd。我想将critical--end1块重定向到一个文件,将warning--end2块重定向到另一个文件。如何做到这一点——谢谢你们两人都在工作。请解释它是如何工作的。将RS设置为nothing
-v RS=
会使
awk
在块(空格分隔)上工作,而不是在行上工作。然后测试块是否同时包含单词
critical
end1
,或者是否包含
warning
end2
。如果像上一节一样包含
警告
end1
,它将不会被打印。我不想像critical和end1那样显示块名,只是我需要显示其中的内容blocks@user3428462我已经更新了帖子中的第二个解决方案,不显示块名和结束部分块到一个文件,警告--end2块到另一个文件。如何做到这一点