天天看點

PERL & SHELL

衆所周知,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

  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的“一行式”解決方法吧,隻是我不知道而已,知道的告知一聲啊,呵呵。

本文轉自Intel_ISN 51CTO部落格,原文連結:http://blog.51cto.com/intelisn/130726,如需轉載請自行聯系原作者