众所周知,perl处理字符串的功能十分强大,然而,作为一种语言,强大是一回事,简单方便则是另外一回事。
今天就遇到一个例子,是这样的,想要在xen上获取某个虚拟机的CPU使用率,于是使用命令“xentop -b -i 2 > /tmp/xentop.tmp”,获得类似下面的数据:
NAME STATE CPU(sec) CPU(%) MEM(k) MEM(%) MAXMEM(k) MAXMEM(%) VCPUS NETS NETTX(k) NETRX(k) VBDS VBD_OO VBD_RD VBD_WR SSID
Domain-0 -----r 1042 0.0 914432 44.6 no limit n/a 2 0 0 0 0 0 0 0 2148573580
VM1 --b--- 70 0.0 532352 26.0 540672 26.4 1 0 0 0 1 0 0 0 2148573580
NAME STATE CPU(sec) CPU(%) MEM(k) MEM(%) MAXMEM(k) MAXMEM(%) VCPUS NETS NETTX(k) NETRX(k) VBDS VBD_OO VBD_RD VBD_WR SSID
Domain-0 -----r 1042 2.4 914432 44.6 no limit n/a 2 0 0 0 0 0 0 0 2148573580
VM1 --b--- 70 0.8 532352 26.0 540672 26.4 1 0 0 0 1 0 0 0 2148573580
今天就遇到一个例子,是这样的,想要在xen上获取某个虚拟机的CPU使用率,于是使用命令“xentop -b -i 2 > /tmp/xentop.tmp”,获得类似下面的数据:
NAME STATE CPU(sec) CPU(%) MEM(k) MEM(%) MAXMEM(k) MAXMEM(%) VCPUS NETS NETTX(k) NETRX(k) VBDS VBD_OO VBD_RD VBD_WR SSID
Domain-0 -----r 1042 0.0 914432 44.6 no limit n/a 2 0 0 0 0 0 0 0 2148573580
VM1 --b--- 70 0.0 532352 26.0 540672 26.4 1 0 0 0 1 0 0 0 2148573580
NAME STATE CPU(sec) CPU(%) MEM(k) MEM(%) MAXMEM(k) MAXMEM(%) VCPUS NETS NETTX(k) NETRX(k) VBDS VBD_OO VBD_RD VBD_WR SSID
Domain-0 -----r 1042 2.4 914432 44.6 no limit n/a 2 0 0 0 0 0 0 0 2148573580
VM1 --b--- 70 0.8 532352 26.0 540672 26.4 1 0 0 0 1 0 0 0 2148573580
对我们有用的是后半部分(也就是xentop第二次计算出的数据),假设我们要提取VM1的CPU使用率,熟悉shell命令的知道,只需要使用下面的命令就可以了:
cat /tmp/xentop.tmp | grep VM1 | tail -n 1 | awk '{print \$4}'
而如果用perl来实现的话呢,一种很自然的处理方式是:先将xentop的结果按行进行split,然后对每一行进行分析,找到以VM1打头的最后一 行,接着再将该行用空格进行split,最后取得结果中的第4项数据。呵呵,split就需要两次,也够麻烦的了。这个问题我跟dahong探讨了一下, 他大体也是这个思路,不过他好像也不是perl的高级用户,:)
或许perl也有类似shell的“一行式”解决方法吧,只是我不知道而已,知道的告知一声啊,呵呵。
cat /tmp/xentop.tmp | grep VM1 | tail -n 1 | awk '{print \$4}'
而如果用perl来实现的话呢,一种很自然的处理方式是:先将xentop的结果按行进行split,然后对每一行进行分析,找到以VM1打头的最后一 行,接着再将该行用空格进行split,最后取得结果中的第4项数据。呵呵,split就需要两次,也够麻烦的了。这个问题我跟dahong探讨了一下, 他大体也是这个思路,不过他好像也不是perl的高级用户,:)
或许perl也有类似shell的“一行式”解决方法吧,只是我不知道而已,知道的告知一声啊,呵呵。
本文转自Intel_ISN 51CTO博客,原文链接:http://blog.51cto.com/intelisn/130726,如需转载请自行联系原作者