我一直在尋找一種方法來檢查進程的內存使用情況在AIX上,發現this page,列出以下命令:瞭解Perl的一個班輪
# svmon -Pt15 | perl -e 'while(<>){print if($.==2||$&&&!$s++);$.=0 if(/^-+$/)}'
它工作正常,我的目的,但我想了解Perl單線程部分如何工作。
我知道它解析了svmon
命令的輸出。我已經理解了輸出第二行的部分$.==2
。部分$.=0
重置行號,以便它可以爲svmon
列出的每個進程執行相同的處理。
但是我很遺憾地理解||$&&&!$s++
這個部分。有一個OR。 $&
是匹配的部分(什麼?)和& &是AND運算符,但我不確定我是否正確分解它。
svmon
返回(沒有任何重定向)每個進程的類似的行塊。第一行是類似於:
# svmon -Pt15 | head -n 20
-------------------------------------------------------------------------------
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
12058652 java 579432 8261 397386 824106 Y Y N
PageSize Inuse Pin Pgsp Virtual
s 4 KB 67560 309 1610 40138
m 64 KB 31992 497 24736 48998
Vsid Esid Type Description PSize Inuse Pin Pgsp Virtual
c86b4c 7e work text data BSS heap m 4096 0 43 4096
c30d43 7f work text data BSS heap m 4096 0 215 4096
db2358 68 work text data BSS heap m 4089 0 3667 4096
d25056 69 work text data BSS heap m 4057 0 585 4096
99d59b 1002 work text data BSS heap m 3461 0 2061 4082
b531b1 7d work text data BSS heap m 3440 0 39 3440
a551a7 1001 work text data BSS heap m 2933 0 2597 3767
970017 90000000 work shared library text m 2172 0 213 2413
ca3c48 6a work text data BSS heap m 2090 0 2006 4096
ade32e 4 work text or shared-lib code seg sm 25389 0 0 25389
... (tons of lines)
-------------------------------------------------------------------------------
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
6094910 java 494585 8110 5754 484444 Y Y N
PageSize Inuse Pin Pgsp Virtual
s 4 KB 31257 158 1610 16780
m 64 KB 28958 497 259 29229
Vsid Esid Type Description PSize Inuse Pin Pgsp Virtual
a31ba7 8 work text or shared-lib code seg m 4096 0 0 4096
da3159 6 work text or shared-lib code seg m 4096 0 0 4096
... repeated several times
與perl的部分的處理後的輸出返回標頭,該劃線與每個進程一行,與命令和存儲器的詳細信息:
# svmon -Pt15 | perl -e 'while(<>){print if($.==2||$&&&!$s++);$.=0 if(/^-+$/)}'
-------------------------------------------------------------------------------
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
12058652 java 579438 8261 397386 824106 Y Y N
6094910 java 494583 8110 5754 484444 Y Y N
5046378 java 382458 8217 5738 339847 Y Y N
21102818 java 352534 8149 5738 305644 Y Y N
18219048 java 321394 8081 176586 340617 Y Y N
18612404 java 235323 8161 100746 267565 Y Y N
3735554 java 195412 8118 125306 222885 Y Y N
24772644 java 185403 8209 88474 202652 Y Y N
25559102 java 143341 8095 5738 118094 Y Y N
11272240 java 137082 8193 82810 167151 Y Y N
18874550 java 131531 8129 79898 144249 Y Y N
5505082 java 121320 8075 50922 136195 Y Y N
這是一個必要的複雜的一行,它看起來像它可能是脆弱的。 (Ab)使用'$ .'看起來非常粗略。 – TLP
可以用更簡單,更穩健的方式完成相同的結果嗎? – Snark
幾乎可以肯定的是,雖然沒有定義或者輸入樣本會有些猜測。 – TLP