grep用于多个模式,每个模式都有选项

时间:2014-03-16 03:50:05

标签: bash sorting sed awk grep

我有这个文件data.txt

BODY1
someval11
someval12

BODY2
someval21

BODY3
someval31
someval32
someval33

BODY1
someval111
someval112

BODY2
someval221

BODY3
someval331
someval332
someval333

我想以这种方式提取 BODY1 段落和接下来的2行以及 BODY3 段落和接下来的3行:

BODY1
someval11
someval12

BODY3
someval31
someval32
someval33

BODY1
someval111
someval112

BODY3
someval331
someval332
someval333

完美的一行可能是grep -e "Body1" -A 2 -e "Body3" -A 3,但它不起作用。用grep有什么方法可以做到这一点吗?

我已经用这种方式解决了这个问题:

 grep "Body1" -A 2 -n data.txt > out1.dat
 grep "Body3" -A 3 -n data.txt > out2.dat
 cat out2.dat >> out1.dat
 sed 's/://g' out1.dat | sed 's/-//g' | sort -n

但有更简单的方法吗?

3 个答案:

答案 0 :(得分:3)

您可以使用sed

sed -n '/^BODY[13]/,/^$/p' inputfile

为了您的输入,它会产生:

BODY1
someval11
someval12

BODY3
someval31
someval32
someval33

BODY1
someval111
someval112

BODY3
someval331
someval332
someval333

答案 1 :(得分:2)

使用awk

awk '/BODY[13]/,/^$/' file

awk '$1~"BODY[13]"' RS= ORS='\n\n' file

注意:第二个答案尾随换行符。

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed -n '/^BODY[13]$/{N;N;/^BODY3$/N;G;p}'  file