免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3413 | 回复: 13

[文本处理] 一个文件中取多个设备的相关信息 [复制链接]

论坛徽章:
0
发表于 2016-06-21 11:32 |显示全部楼层
本帖最后由 冰封三万里 于 2016-06-21 11:36 编辑

下方是一个命令出来的所有HBA卡的设备信息,所有设备都在一个界面中生成,我个人无法通过循环来处理这个文件得到相应的信息,请问能否用正则解决、

系统为Unix  

文件如下:三种颜色代表三个设备,标红字符串为要取的值,注意:不一定只有三个设备  也可能是两个,四个,六个,八个,三个是我自己编出来的。。。
HBA Port WWN: 100031578cdsfs54564
    OS Device Nam: /dev/cfg/c1
    Driver Version: 2.054.25
    state: online
    Current Speed: 8Gb
    Type: N-port
    Serial Name: 099sdf56554

HBA Port WWN: 222031578cdsfs54564
    OS Device Nam: /dev/cfg/c2
    Driver Version: 3.054.25
    state: online
    Current Speed: 4Gb
    Type: N-port
    Serial Name: 777sdf56554

HBA Port WWN: 33445531578cdsfs54564
    OS Device Nam: /dev/cfg/c3
    Driver Version: 5.054.25
    state: online
    Current Speed: 2Gb
    Type: N-port
    Serial Name: 3211df56554


需求:我如何才能分别取得三台设备的标红信息,从一个输出中展示出来
例如 name :c1
       wwn:100031578cdsfs54564
       speed :8Gb

       name :c2
       wwn:222031578cdsfs54564
       speed :4Gb

       name :c3
       wwn:33445531578cdsfs54564
       speed :2Gb

我能用正则取出设备的相关信息,但是无法通过如上展示,还请各位赐教

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2016-06-21 11:53 |显示全部楼层
  1. sed -r '/WWN/{s/[^:]+/wwn/;h};/Nam:/{s/.*\//name: /p;x;p};/Speed/{s/[^:]+(.*)/speed\1\n/p};d'
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2016-06-21 11:56 |显示全部楼层
回复 1# 冰封三万里

$ awk '/WWN:/{w="wwn: "$NF"\n"}/Device Name:/{sub(".*[/]","",$NF);n="name: "$NF"\n"}/Speed:/{print n w "speed:",$NF"\n"}' FILE
name: c1
wwn: 100031578cdsfs54564
speed: 8Gb

name: c2
wwn: 222031578cdsfs54564
speed: 4Gb

name: c3
wwn: 33445531578cdsfs54564
speed: 2Gb


   

论坛徽章:
0
发表于 2016-06-21 12:14 |显示全部楼层
回复 2# moperyblue
谢谢回复~有个问题想请教一下

sed -r '/WWN/{s/[^:]+/wwn/;h};/Nam:/{s/.*\//name: /p;x;p};/Speed/{s/[^:]+(.*)/speed\1\n/p};d'

其他的地方能看懂  请问标红的这些字符  应该怎么去理解呢?还有个问题  就是这个sed  是不是并没有控制循环  只不过是从头到尾的处理了一个遍文本?可以这么理解么


   

论坛徽章:
0
发表于 2016-06-21 12:16 |显示全部楼层
回复 3# jason680


    name没有出来

    另外想问一下   除了这种格式输出以外  可以单独的取出来我所需的信息么  比如name一组   speed一组  wwn一组 这样

论坛徽章:
0
发表于 2016-06-21 12:18 |显示全部楼层
回复 3# jason680


    我知道为什么name没出来了   我给的文本有问题

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
发表于 2016-06-21 12:34 |显示全部楼层
回复 1# 冰封三万里
  1. sed -nr '/WWN/,/Serial Name/{/WWN/{s/.*(:.*)/wwn\1/;h};/OS/{s#.*/(.*)#name: \1#;x;H};/Speed/{s/.*(:.*)/speed\1/;H};/Serial/{g;p}}'
  2. name: c1
  3. wwn: 100031578cdsfs54564
  4. speed: 8Gb
  5. name: c2
  6. wwn: 222031578cdsfs54564
  7. speed: 4Gb
  8. name: c3
  9. wwn: 33445531578cdsfs54564
  10. speed: 2Gb
复制代码

论坛徽章:
0
发表于 2016-06-21 12:36 |显示全部楼层
回复 7# liion631818


    好用 不过我这个SunOS  不支持-r   还要改很多转义符

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2016-06-21 12:50 |显示全部楼层
回复 4# 冰封三万里
http://bbs.chinaunix.net/thread-1762006-1-1.html

info sed

`h'
     Replace the contents of the hold space with the contents of the
     pattern space.
     
`x'
     Exchange the contents of the hold and pattern spaces.
     
     
`d'
     Delete the pattern space; immediately start next cycle.

`p'
     Print out the pattern space (to the standard output).  This
     command is usually only used in conjunction with the `-n'
     command-line option.

sed 是逐行处理
在一行内可以用标签跳转实现循环处理(如=> :a;s/x/o/;ta)
   

论坛徽章:
2
luobin
日期:2016-06-17 17:46:36lufei
日期:2016-06-17 17:49:16
发表于 2016-06-21 14:03 |显示全部楼层
本帖最后由 hz_oracle 于 2016-06-21 15:06 编辑

awk -F':|/' '/^HBA/{a=$2;next}/OS Device/{print "name"":"$5"\n""wwn"":"a;next}/Current/{print "speed"":"$2}' file

终于写出来一回了。看楼上大神这么6我感觉好无奈
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP