1. 程式人生 > >linux工具之awk利用:獲取cpu佔用率達到一定值的程序的PID

linux工具之awk利用:獲取cpu佔用率達到一定值的程序的PID

之前我對awk的使用僅限於從格式確定的字串輸出中取出自己相要的欄位。但是最近有一個需求,需要從標準輸出中擷取一個欄位,但是這個標準輸出看上去好像格式並不統一

這個命令就是top -bn 1 -i -c

輸出如下:

top - 12:23:08 up 16 days, 20:30,  6 users,  load average: 1.20, 1.17, 0.80
Tasks: 287 total,   1 running, 286 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.4 us,  6.9 sy,  0.0 ni, 90.7 id,  0.0 wa,  0.0
hi, 0.0 si, 0.0 st KiB Mem : 32945412 total, 22137276 free, 8835848 used, 1972288 buff/cache KiB Swap: 1044476 total, 1044476 free, 0 used. 23118824 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 20491 user 20 0 42948 3520 2872 R 5.9 0.0 0:00.01 top -bn
1 -i -c

我需要獲取cpu佔用率達到一定值的程序的PID。也就是說,我只關注top命令的第二部分:

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
20491 user      20   0   42948   3520   2872 R   5.9  0.0   0:00.01 top -bn 1 -i -c

如果只是單純地用 top -bn 1 -i -c |grep PID | awk '{print $1}'這樣的命令似乎沒有辦法優雅地達到我的目的。
我想過,在grep的時候,獲取命中行的下面N行,但是我永遠無法知道這個N等於多少。
我覺得awk就是linux字元處理工具裡的瑞士軍刀,它肯定可以。

awk是可程式設計的

其實 awk '{print $}'這個命令中,''中的部分是一個指令碼,而且不僅在awk命令後面可以有指令碼,在awk命令之前也可以寫一些指令碼。這些指令碼的用途就是對awk的輸入做一些預先的處理,或者過濾。
根據這個思路,再回到我的需求:cpu佔用率達到一定值的程序的PID,我寫出了這條命令:
top -bn 1 -i -c |awk '{ if (NR > 6) print }' |awk '{ if ($9 > 99) print $1,$9}'
第一個if過濾掉了top命令的上半部分;第二個if篩選出了我想要的PID。

awk的內建變數

awk之所以可以高效地獲取欄位,是因為內建了很多變數,靈活運用這些變數,可以讓這把瑞士軍刀發揮它最大的功效:
NR:我的理解就是number of record,已處理的輸入記錄數
NF:我的理解就是number of field,資料檔案中的欄位總數
FS:輸入欄位分割符 field seperator
RS:輸入記錄分割符 record seperator

最後推薦一本書:《Linux命令列與shell指令碼程式設計大全 第3版 ,布魯姆 ,P606.pdf》