我有像critical---end1
和warning end2
这样的n个块,如下所示:
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
我必须使用critical---end1
或warning-----end2
来仅查看所有块sed
和awk
?
答案 0 :(得分:0)
有些人喜欢这样:
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
答案 1 :(得分:0)
sed -n '/^critical$/,/^end1$/p; /^warning$/,/^end2$/p' file |
grep -v -e '^critical$' -e '^warning$' -e '^end[12]$'
-n
告诉sed
默认不打印所有行,其他两个命令是使用p
命令打印第一个和第二个地址之间所有行的范围。 / p>
ETA:错过分隔线,最简单的方法是用grep -v
删除它们,它只打印与给定的任何模式都不匹配的行。