我有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
我必须只grep所有块critical---end1
和warning-----end2
使用sed
或awk
?
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
这将数据保存到两个文件critial
和warning