免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1770 | 回复: 5
打印 上一主题 下一主题

awk能实现这样的效果吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-03 12:06 |只看该作者 |倒序浏览
文件有以下信息,:
  1. v  lv_index_data19 -         ENABLED  ACTIVE   8388608  SITEREAD  -        fsgen
  2. pl lv_index_data19-01 lv_index_data19 ENABLED ACTIVE 8388608 CONCAT -      RW
  3. sd datadg01-61  lv_index_data19-01 datadg01 318791744 8388608 0   DS4500-0_5 ENA
  4. pl lv_index_data19-02 lv_index_data19 ENABLED ACTIVE 8388608 CONCAT -      RW
  5. sd hdisk9-150   lv_index_data19-02 hdisk9 580670688 8388608 0     Disk_2   ENA
  6. dc lv_index_data19_dco lv_index_data19 lv_index_data19_dcl
  7. v  lv_index_data19_dcl -     ENABLED  ACTIVE   1120     SITEREAD  -        gen
  8. pl lv_index_data19_dcl-01 lv_index_data19_dcl ENABLED ACTIVE 1120 CONCAT - RW
  9. sd hdisk7-79    lv_index_data19_dcl-01 hdisk7 188234768 1120 0    DS4500-0_0 ENA

  10. v  lv_index_data20 -         ENABLED  ACTIVE   8388608  SITEREAD  -        fsgen
  11. pl lv_index_data20-01 lv_index_data20 ENABLED ACTIVE 8388608 CONCAT -      RW
  12. sd datadg01-62  lv_index_data20-01 datadg01 327180352 8388608 0   DS4500-0_5 ENA
  13. dc lv_index_data20_dco lv_index_data20 lv_index_data20_dcl
  14. v  lv_index_data20_dcl -     ENABLED  ACTIVE   1120     SITEREAD  -        gen
  15. pl lv_index_data20_dcl-01 lv_index_data20_dcl ENABLED ACTIVE 1120 CONCAT - RW
  16. sd hdisk7-80    lv_index_data20_dcl-01 hdisk7 188235888 1120 0    DS4500-0_0 ENA
  17. pl lv_index_data20_dcl-02 lv_index_data20_dcl ENABLED ACTIVE 1120 CONCAT - RW
  18. sd hdisk9-151   lv_index_data20_dcl-02 hdisk9 5319360 1120 0      Disk_2   ENA
复制代码

需要做以下几部判断:
1.从v开头的行开始到出现dc开头的结尾的几行,也就是包含v开头以下的3到5行(包含v开头的一行在内)
也就是匹配到下列结果(颜色标记的为匹配到的结果):
v  lv_index_data19 -         ENABLED  ACTIVE   8388608  SITEREAD  -        fsgen
pl lv_index_data19-01 lv_index_data19 ENABLED ACTIVE 8388608 CONCAT -      RW
sd datadg01-61  lv_index_data19-01 datadg01 318791744 8388608 0   DS4500-0_5 ENA
pl lv_index_data19-02 lv_index_data19 ENABLED ACTIVE 8388608 CONCAT -      RW
sd hdisk9-150   lv_index_data19-02 hdisk9 580670688 8388608 0     Disk_2   ENA

dc lv_index_data19_dco lv_index_data19 lv_index_data19_dcl
v  lv_index_data19_dcl -     ENABLED  ACTIVE   1120     SITEREAD  -        gen
pl lv_index_data19_dcl-01 lv_index_data19_dcl ENABLED ACTIVE 1120 CONCAT - RW
sd hdisk7-79    lv_index_data19_dcl-01 hdisk7 188234768 1120 0    DS4500-0_0 ENA


v  lv_index_data20 -         ENABLED  ACTIVE   8388608  SITEREAD  -        fsgen
pl lv_index_data20-01 lv_index_data20 ENABLED ACTIVE 8388608 CONCAT -      RW
sd datadg01-62  lv_index_data20-01 datadg01 327180352 8388608 0   DS4500-0_5 ENA

dc lv_index_data20_dco lv_index_data20 lv_index_data20_dcl
v  lv_index_data20_dcl -     ENABLED  ACTIVE   1120     SITEREAD  -        gen
pl lv_index_data20_dcl-01 lv_index_data20_dcl ENABLED ACTIVE 1120 CONCAT - RW
sd hdisk7-80    lv_index_data20_dcl-01 hdisk7 188235888 1120 0    DS4500-0_0 ENA
pl lv_index_data20_dcl-02 lv_index_data20_dcl ENABLED ACTIVE 1120 CONCAT - RW
sd hdisk9-151   lv_index_data20_dcl-02 hdisk9 5319360 1120 0      Disk_2   ENA

2.如果匹配到的3行或5行出现2个sd开头的行,且第8列(也就是出现DS4500-0_5或Disk_2)值不同,则忽略。
下面内容加粗的为忽略的内容:
v  lv_index_data19 -         ENABLED  ACTIVE   8388608  SITEREAD  -        fsgen
pl lv_index_data19-01 lv_index_data19 ENABLED ACTIVE 8388608 CONCAT -      RW
sd datadg01-61  lv_index_data19-01 datadg01 318791744 8388608 0   DS4500-0_5 ENA
pl lv_index_data19-02 lv_index_data19 ENABLED ACTIVE 8388608 CONCAT -      RW
sd hdisk9-150   lv_index_data19-02 hdisk9 580670688 8388608 0     Disk_2   ENA

dc lv_index_data19_dco lv_index_data19 lv_index_data19_dcl
v  lv_index_data19_dcl -     ENABLED  ACTIVE   1120     SITEREAD  -        gen
pl lv_index_data19_dcl-01 lv_index_data19_dcl ENABLED ACTIVE 1120 CONCAT - RW
sd hdisk7-79    lv_index_data19_dcl-01 hdisk7 188234768 1120 0    DS4500-0_0 ENA


v  lv_index_data20 -         ENABLED  ACTIVE   8388608  SITEREAD  -        fsgen
pl lv_index_data20-01 lv_index_data20 ENABLED ACTIVE 8388608 CONCAT -      RW
sd datadg01-62  lv_index_data20-01 datadg01 327180352 8388608 0   DS4500-0_5 ENA

dc lv_index_data20_dco lv_index_data20 lv_index_data20_dcl
v  lv_index_data20_dcl -     ENABLED  ACTIVE   1120     SITEREAD  -        gen
pl lv_index_data20_dcl-01 lv_index_data20_dcl ENABLED ACTIVE 1120 CONCAT - RW
sd hdisk7-80    lv_index_data20_dcl-01 hdisk7 188235888 1120 0    DS4500-0_0 ENA
pl lv_index_data20_dcl-02 lv_index_data20_dcl ENABLED ACTIVE 1120 CONCAT - RW
sd hdisk9-151   lv_index_data20_dcl-02 hdisk9 5319360 1120 0      Disk_2   ENA

3.如果匹配到的3行或5行只出现1个sd开头的行记录,则打印第1列2列以及第8列,输出到指定文件result,每列间指定宽度,第1列为2个字符,2,3列为20个字符。

dc lv_index_data19_dco lv_index_data19 lv_index_data19_dcl
v  lv_index_data19_dcl -     ENABLED  ACTIVE   1120     SITEREAD  -        gen
pl lv_index_data19_dcl-01 lv_index_data19_dcl ENABLED ACTIVE 1120 CONCAT - RW
sd hdisk7-79    lv_index_data19_dcl-01 hdisk7 188234768 1120 0    DS4500-0_0 ENA

v  lv_index_data20 -         ENABLED  ACTIVE   8388608  SITEREAD  -        fsgen
pl lv_index_data20-01 lv_index_data20 ENABLED ACTIVE 8388608 CONCAT -      RW
sd datadg01-62  lv_index_data20-01 datadg01 327180352 8388608 0   DS4500-0_5 ENA



最后输出的结果如下:

  1. v   lv_index_data19_dcl  DS4500-0_0           
  2. v   lv_index_data20        DS4500-0_5        
复制代码


由于记录比较多,文件有150KB,手工比较实在是比较耗时间,不知道能否用awk或者其他shell实现,先多谢各位。

不知道大家有没有明白我说的意思,表达能力不行,希望大家谅解!

[ 本帖最后由 zibingsu 于 2009-12-3 16:10 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-12-03 12:54 |只看该作者
说了这么多,都没说清楚。

论坛徽章:
0
3 [报告]
发表于 2009-12-03 14:29 |只看该作者
能说清楚点吗?

论坛徽章:
0
4 [报告]
发表于 2009-12-03 16:07 |只看该作者
重新修改了下贴子,把每个步骤的结果都颜色标注了以下,希望大家能明白,谢谢!

论坛徽章:
0
5 [报告]
发表于 2009-12-03 17:30 |只看该作者
呵呵试试吧,写的好复杂阿呵呵

awk '/^v /{do{b=$0;getline;if($0~/^sd/){e=$8;sub(/_.*/,"",e);a[e]++;c++;d[$8]=$0}}while(($0!~/^dc/)&&($0!=b));if(c==1){for(j in a){print d[j]}};if(c==2){for(k in a){ if(a[k]==2){for(j in d){print d[j]}}}};delete a;c=0;delete d}' data

[ 本帖最后由 sunbw001 于 2009-12-3 17:32 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-12-03 18:06 |只看该作者
  1. #!/usr/bin/awk -f

  2. /^v/ {
  3.         os=sprintf("%-2s%-20s",$1,$2)
  4.         v8 = ""
  5.         i  = 0;
  6.         while(getline == 1 && $0 !~ /^dc/) {
  7.                 if($0 ~ /^sd/ && v8 != $8) {
  8.                         i = i + 1
  9.                         v8 = $8
  10.                 }
  11.         }

  12.         if(i == 1){
  13.                 printf("%s%-20s\n",os,v8)
  14.         }
  15. }
复制代码

v和dc必须成对出现才行
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP