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

时间:2014-03-17 11:45:39

标签: unix sed awk

我有像critical---end1warning 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---end1warning-----end2来仅查看所有块sedawk

2 个答案:

答案 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

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

答案 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删除它们,它只打印与给定的任何模式都不匹配的行。