免费注册 查看新帖 |

Chinaunix

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

有没有处理命令结果字符串的好方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-27 09:46 |只看该作者 |倒序浏览
小弟最近在写脚本监控系统状态.

     遇到这样的问题.使用 df 查看系统的目录使用情况.

  1. Filesystem           1K-blocks      Used Available Use% Mounted on
  2. /dev/mapper/VolGroup00-LogVol00
  3.                      1347853136   8527980 1269753780   1% /
  4. /dev/cciss/c0d0p2      4956316    217360   4483124   5% /var
  5. /dev/cciss/c0d0p1       101086     12379     83488  13% /boot
  6. tmpfs                 32994564         0  32994564   0% /dev/shm
复制代码
使用 split 截取的时候, 根目录 "/" 是换行了, 我想取出每个目录的所有属性值.请问如何写比较好呢.

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2012-12-27 10:00 |只看该作者
这个好尴尬,不会

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
3 [报告]
发表于 2012-12-27 10:33 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. $/ = "";
  5. while(<DATA>){
  6.        
  7.     1 while(/(\S+)\s+((?:[\d%]+\s+){4})(\S+)(?{print "$1|$2|$3\n"})/g);
  8.    
  9. }
  10. __DATA__
  11. Filesystem           1K-blocks      Used Available Use% Mounted on
  12. /dev/mapper/VolGroup00-LogVol00
  13.                      1347853136   8527980 1269753780   1% /
  14. /dev/cciss/c0d0p2      4956316    217360   4483124   5% /var
  15. /dev/cciss/c0d0p1       101086     12379     83488  13% /boot
  16. tmpfs                 32994564         0  32994564   0% /dev/shm
复制代码
这样?
OUTPUT
  1. /dev/mapper/VolGroup00-LogVol00|1347853136   8527980 1269753780   1% |/
  2. /dev/cciss/c0d0p2|4956316    217360   4483124   5% |/var
  3. /dev/cciss/c0d0p1|101086     12379     83488  13% |/boot
  4. tmpfs|32994564         0  32994564   0% |/dev/shm
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-12-27 10:43 |只看该作者
可以试试这个模块 Filesys:f

论坛徽章:
0
5 [报告]
发表于 2012-12-27 12:08 |只看该作者
mcshell 发表于 2012-12-27 10:33
这样?
OUTPUT




额,请问这个
  1. (?{print "$1|$2|$3\n"})
复制代码
的用法是什么意思呢,没有见过阿.

论坛徽章:
0
6 [报告]
发表于 2012-12-27 12:10 |只看该作者
zhlong8 发表于 2012-12-27 10:00
这个好尴尬,不会



之前看过仙子的一个系统检测程序,受到启发,但是遇到这种情况....

论坛徽章:
0
7 [报告]
发表于 2012-12-27 12:11 |只看该作者
xiaofanbbk 发表于 2012-12-27 10:43
可以试试这个模块 Filesys:f



我去查下cpan  

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
8 [报告]
发表于 2012-12-27 12:33 |只看该作者
  1. 1 while(/(\S+)\s+((?:[\d%]+\s+){4})(\S+)(?{print "$1|$2|$3\n"})/g);
复制代码
回复 5# illidanee
等于
  1. while(/(\S+)\s+((?:[\d%]+\s+){4})(\S+)/g){
  2. print "$1|$2|$3\n"
  3. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2012-12-27 14:30 |只看该作者
mcshell 发表于 2012-12-27 12:33
回复 5# illidanee
等于




非常感谢,我的问题解决了.
代码如下:

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;

  5. $/="";
  6. my $str;
  7. my $i=0;
  8. open(CMD, "df |");
  9. while(<CMD>){
  10.   while(/(\S+)\s+([\d%]+)\s+([\d%]+)\s+([\d%]+)\s+([\d%]+)\s+(\S+)/g) {
  11.     @{${$str}[$i++]}=($1,$2,$3,$4,$5,$6);
  12.   }
  13. }
  14. close(CMD);

  15. print Dumper($str);
复制代码
将数据全部存储到了数据里面了.


请问在正则表达式里面写语句的语法是哪些呢?这个方面还不是很了解.但是你的意思我懂起了.

论坛徽章:
0
10 [报告]
发表于 2012-12-27 15:53 |只看该作者
回复 1# illidanee


    df有个参数-P
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP