文本:
- This is line 1
-
AAAAAA lineA1
-
AAAAAA lineA2
-
AAAAAA lineA3
-
This is line 5
-
This is line 6
-
BBBBB lineB1
-
BBBBB lineB2
-
This is line 9
-
This is line 10
1.取出匹配AAAAAA的第一行
- code1:
-
sed -n '/AAAAAA/{p;q}' file
- output:
- AAAAAA lineA1
- code2:
-
awk '/AAAAAA/{print;exit}' file
- output:
- AAAAAA lineA1
简单说明:上面两行代码都是第一次遇到匹配/AAAAAA/的行就对其打印后立马退出程序。
2.打印匹配/BBBBB/的最后一行最后一行
- code1:
-
#sed -n '/BBBBB/{h};${x;p}' file
-
BBBBB lineB2
简单说明:
一旦匹配/BBBBB/就把这一行复制到hold space中。如果h的作用就是如果hold的space中有内容,就给起替换掉。直到文件最后一行通过x将hold space中的内容copy回pattern space中。打印输出结果就是匹配到/BBBBB/的最后一行了。
3 .打印匹配/AAAAAA/的第一行到配匹配/BBBBB/的最后一行。
- code:
-
#sed -n '/AAAAAA/,/BBBBB/{p}' file
-
AAAAAA lineA1
-
AAAAAA lineA2
-
AAAAAA lineA3
-
This is line 5
-
This is line 6
-
BBBBB lineB1
4.打印匹配/AAAAAA/ 的最后一行到匹配/BBBBB/的第一行
- code1:
-
sed -n \
-
'/AAAAAA/ {
-
:a
-
H
-
n
-
/BBBBB/ {
-
H
-
x
-
s/.*\(AAAAAA.*\)/\1/g
-
p
-
b
-
}
-
b a
-
}' file
-
output:
-
AAAAAA lineA3
-
This is line 5
-
This is line 6
-
BBBBB lineB1
简单说明:
具体思路:将读入每一行都添加到hold space后 一直遇到/BBBBB/ 第一行将hold space中的内容换到pattern space 中进行处理。删掉最后一行/AAAAAA/前面的所有内容。从而得到结果。
- code2:
-
#!/usr/bin/perl
-
use warnings;
-
use strict;
-
my @a;
-
while(<>){
-
@a = () if /AAAAAA/;
-
push @a,$_;
-
if(/BBBBB/){
-
print @a;
-
last;
-
}
-
}
-
output:
-
AAAAAA lineA3
-
This is line 5
-
This is line 6
-
BBBBB lineB1
简单说明:
读入每一行,如果匹配到AAAAAA 就把数组a清空。直到匹配到BBBBB 后 打印数组中的内容。退出循环。
5.打印匹配AAAAAA 第一行到匹配BBBBB最后一行。
- code1:
-
sed -n '/^AAAAAA/{:a;N;${s/\(.*BBBBB[^\n]*\).*/\1/p};Ta}' file
- output:
- AAAAAA lineA1
- AAAAAA lineA2
- AAAAAA lineA3
- This is line 5
- This is line 6
- BBBBB lineB1
- BBBBB lineB2
简单说明:
将从AAAAAA开始的所有行都N到pattern space中,然后去掉最后一行BBBBB后面的行 打印
- code2:
- awk '{if($1~/^AAA/){has=2;}else if($1~/^BBBB/) {has=1;}else{if(has!=2)has=0;} if(has)print}' file
上面awk的 代码 具有一定的局限性 如果下面BBBBB是不连续的话 代码就不能用了,值得学习的地方是通过标志has的值来判断是否打印。从AAAAAA开始一直打印到连续BBBBB的最后一行。
6. 打印匹配AAAAAA最后一行到BBBBB最后一行。
- code1:
-
awk 'BEGIN{swh="off"}{if(ll~/^AA/&&$0!~/AA/){print ll;swh="on";}if(ll~/^BB/&&$0!~/^BB/){swh="off";};ll=$0;if(swh~/on/){print $0}}' file
简单说明:
该awk 也是要求AAAAAA 连续的 不然就不行了。
- code2:
-
分两步:
-
1.获取最后一行行数
-
awk '{if($0~/AAAAAA/)a=FNR;if($0~/BBBBB/)b=FNR}END{print a,b}' file
-
2.用sed打印
阅读(9349) | 评论(0) | 转发(0) |