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》