Unix 在n个块之间使用sed命令获取行
我有n个块,如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
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块到另一个文件。如何做到这一点