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



我有n个像critical---end1warning 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

我必须只grep所有块critical---end1warning-----end2使用sedawk ?

sed -n '/^critical$/,/^end1$/p; /^warning$/,/^end2$/p' file |
grep -v -e '^critical$' -e '^warning$' -e '^end[12]$'

-n告诉sed默认情况下不打印所有行,其他两个命令是使用p命令打印第一个和第二个地址之间的所有行。

ETA:要错过分隔行,最简单的方法是使用grep -v删除它们,它只打印与给定的任何模式不匹配的行。

有些像这样:

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

这将数据保存到两个文件critialwarning

最新更新