Chinaunix首页 | 论坛 | 博客
  • 博客访问: 343046
  • 博文数量: 61
  • 博客积分: 2451
  • 博客等级: 上尉
  • 技术积分: 650
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-06 21:24
文章分类

全部博文(61)

文章存档

2012年(1)

2011年(44)

2010年(16)

分类: LINUX

2011-06-03 14:09:52

文本:
  1. This is line 1
  2. AAAAAA lineA1
  3. AAAAAA lineA2
  4. AAAAAA lineA3
  5. This is line 5
  6. This is line 6
  7. BBBBB lineB1
  8. BBBBB lineB2
  9. This is line 9
  10. This is line 10
1.取出匹配AAAAAA的第一行
  1. code1:
  2. sed -n '/AAAAAA/{p;q}' file
  3. output:
  4. AAAAAA lineA1
  1. code2:
  2. awk '/AAAAAA/{print;exit}' file
  3. output:
  4. AAAAAA lineA1
简单说明:上面两行代码都是第一次遇到匹配/AAAAAA/的行就对其打印后立马退出程序。

2.打印匹配/BBBBB/的最后一行最后一行
  1. code1:
  2. #sed -n '/BBBBB/{h};${x;p}' file
  3. BBBBB lineB2
简单说明:
一旦匹配/BBBBB/就把这一行复制到hold space中。如果h的作用就是如果hold的space中有内容,就给起替换掉。直到文件最后一行通过x将hold space中的内容copy回pattern space中。打印输出结果就是匹配到/BBBBB/的最后一行了。

3 .打印匹配/AAAAAA/的第一行到配匹配/BBBBB/的最后一行。
  1. code:
  2. #sed -n '/AAAAAA/,/BBBBB/{p}' file
  3. AAAAAA lineA1
  4. AAAAAA lineA2
  5. AAAAAA lineA3
  6. This is line 5
  7. This is line 6
  8. BBBBB lineB1
4.打印匹配/AAAAAA/ 的最后一行到匹配/BBBBB/的第一行
  1. code1:
  2. sed -n \
  3. '/AAAAAA/ {
  4. :a
  5. H
  6. n
  7. /BBBBB/ {
  8. H
  9. x
  10. s/.*\(AAAAAA.*\)/\1/g
  11. p
  12. b
  13. }
  14. b a
  15. }' file
  16. output:
  17. AAAAAA lineA3
  18. This is line 5
  19. This is line 6
  20. BBBBB lineB1
简单说明:
具体思路:将读入每一行都添加到hold space后 一直遇到/BBBBB/ 第一行将hold space中的内容换到pattern space 中进行处理。删掉最后一行/AAAAAA/前面的所有内容。从而得到结果。
  1. code2:
  2. #!/usr/bin/perl
  3. use warnings;
  4. use strict;
  5. my @a;
  6. while(<>){
  7.         @a = () if /AAAAAA/;
  8.         push @a,$_;
  9.         if(/BBBBB/){
  10.                 print @a;
  11.                 last;
  12.         }
  13. }
  14. output:
  15. AAAAAA lineA3
  16. This is line 5
  17. This is line 6
  18. BBBBB lineB1
简单说明:
读入每一行,如果匹配到AAAAAA 就把数组a清空。直到匹配到BBBBB 后 打印数组中的内容。退出循环。

5.打印匹配AAAAAA 第一行到匹配BBBBB最后一行。
  1. code1:
  2. sed -n '/^AAAAAA/{:a;N;${s/\(.*BBBBB[^\n]*\).*/\1/p};Ta}' file
  3. output:
  4. AAAAAA lineA1
  5. AAAAAA lineA2
  6. AAAAAA lineA3
  7. This is line 5
  8. This is line 6
  9. BBBBB lineB1
  10. BBBBB lineB2
简单说明:
将从AAAAAA开始的所有行都N到pattern space中,然后去掉最后一行BBBBB后面的行 打印
  1. code2:
  2. 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最后一行。
  1. code1:
  2. 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 连续的 不然就不行了。
  1. code2:
  2. 分两步:
  3. 1.获取最后一行行数
  4. awk '{if($0~/AAAAAA/)a=FNR;if($0~/BBBBB/)b=FNR}END{print a,b}' file
  5. 2.用sed打印

阅读(8862) | 评论(0) | 转发(0) |
0

上一篇:perl 杂记 Ⅱ

下一篇:合并行

给主人留下些什么吧!~~