Linux Shell常用技巧(十)
二十. 通過管道組合Shell命令獲取系統(tǒng)運行數(shù)據(jù):
?? ?1.? 輸出當前系統(tǒng)中占用內(nèi)存最多的5條命令:
?? ?#1) 通過ps命令列出當前主機正在運行的所有進程。
?? ?#2) 按照第五個字段基于數(shù)值的形式進行正常排序(由小到大)。
?? ?#3) 僅顯示最后5條輸出。
?? ?/> ps aux | sort -k 5n | tail -5
?? ?stephen?? 1861? 0.2? 2.0? 96972 21596? ?? S???? Nov11?? 2:24 nautilus
?? ?stephen?? 1892? 0.0? 0.4 102108? 4508? ?? S<sl Nov11?? 0:00 /usr/bin/pulseaudio
?? ?stephen?? 1874? 0.0? 0.9 107648 10124 ?? S???? Nov11?? 0:00 gnome-volume
?? ?stephen?? 1855? 0.0? 1.2 123776 13112 ?? Sl???? Nov11?? 0:00 metacity
?? ?stephen?? 1831? 0.0? 0.9 125432? 9768? ?? Ssl?? Nov11?? 0:05 /usr/libexec/gnome
?? ?
?? ?2.? 找出cpu利用率高的20個進程:
?? ?#1) 通過ps命令輸出所有進程的數(shù)據(jù),-o選項后面的字段列表列出了結(jié)果中需要包含的數(shù)據(jù)列。
?? ?#2) 將ps輸出的Title行去掉,grep -v PID表示不包含PID的行。
?? ?#3) 基于第一個域字段排序,即pcpu。n表示以數(shù)值的形式排序。
?? ?#4) 輸出按cpu使用率排序后的最后20行,即占用率最高的20行。
?? ?/> ps -e -o pcpu,pid,user,sgi_p,cmd | grep -v PID | sort -k 1n | tail -20
??? 3.? 獲取當前系統(tǒng)物理內(nèi)存的總大小:
?? ?#1) 以兆(MB)為單位輸出系統(tǒng)當前的內(nèi)存使用狀況。
?? ?#2) 通過grep定位到Mem行,該行是以操作系統(tǒng)為視角統(tǒng)計數(shù)據(jù)的。
?? ?#3) 通過awk打印出該行的第二列,即total列。
?? ?/> free -m | grep "Mem" | awk '{print $2, "MB"}'
?? ?1007 MB
二十一. 通過管道組合Shell命令進行系統(tǒng)管理:
?? ?1.? 獲取當前或指定目錄下子目錄所占用的磁盤空間,并將結(jié)果按照從大到小的順序輸出:
?? ?#1) 輸出/usr的子目錄所占用的磁盤空間。
?? ?#2) 以數(shù)值的方式倒排后輸出。
?? ?/> du -s /usr/* | sort -nr
?? ?1443980 /usr/share
?? ?793260?? /usr/lib
?? ?217584?? /usr/bin
?? ?128624?? /usr/include
?? ?60748??? /usr/libexec
?? ?45148??? /usr/src
?? ?21096??? /usr/sbin
?? ?6896?? ?? /usr/local
?? ?4?????????? /usr/games
?? ?4?????????? /usr/etc
?? ?0?????????? /usr/tmp
?? ?
?? ?2.? 批量修改文件名:
?? ?#1) find命令找到文件名擴展名為.output的文件。
?? ?#2) sed命令中的-e選項表示流編輯動作有多次,第一次是將找到的文件名中相對路徑前綴部分去掉,如./aa改為aa。
??? #??? 流編輯的第二部分,是將20110311替換為mv & 20110310,其中&表示s命令的被替換部分,這里即源文件名。
?? ?#??? \1表示被替換部分中#的\(.*\)。
??? #3) 此時的輸出應為
?? ?#?? ?mv 20110311.output 20110310.output
?? ?#?? ?mv 20110311abc.output 20110310abc.output
?? ?#??? 最后將上面的輸出作為命令交給bash命令去執(zhí)行,從而將所有20110311*.output改為20110311*.output
?? ?/> find ./ -name "*.output" -print? | sed -e 's/.\///g' -e 's/20110311\(.*\)/mv & 20110310\1/g' | bash
???
?? ?3.? 統(tǒng)計當前目錄下文件和目錄的數(shù)量:
?? ?#1) ls -l命令列出文件和目錄的詳細信息。
??? #2) ls -l輸出的詳細列表中的第一個域字段是文件或目錄的權(quán)限屬性部分,如果權(quán)限屬性部分的第一個字符為d,
?? ?#??? 該文件為目錄,如果是-,該文件為普通文件。
??? #3) 通過wc計算grep過濾后的行數(shù)。
?? ?/> ls -l * | grep "^-" | wc -l
?? ?/> ls -l * | grep "^d" | wc -l
???
?? ?4.? 殺掉指定終端的所有進程:
?? ?#1) 通過ps命令輸出終端為pts/1的所有進程。
?? ?#2) 將ps的輸出傳給grep,grep將過濾掉ps輸出的Title部分,-v PID表示不包含PID的行。
?? ?#3) awk打印輸出grep查找結(jié)果的第一個字段,即pid字段。
?? ?#4) 上面的三個組合命令是在反引號內(nèi)被執(zhí)行的,并將執(zhí)行的結(jié)果賦值給數(shù)組變量${K}。
?? ?#5) kill方法將殺掉數(shù)組${K}包含的pid。
?? ?/> kill -9 ${K}=`ps -t pts/1 | grep -v PID | awk '{print $1}'`?? ?
?? ?5.? 將查找到的文件打包并copy到指定目錄:
?? ?#1) 通過find找到當前目錄下(包含所有子目錄)的所有*.txt文件。
?? ?#2) tar命令將find找到的結(jié)果壓縮成test.tar壓縮包文件。
?? ?#3) 如果&&左側(cè)括號內(nèi)的命令正常完成,則可以執(zhí)行&&右側(cè)的shell命令了。
?? ?#4) 將生成后的test.tar文件copy到/home/.目錄下。
?? ?/> (find . -name "*.txt" | xargs tar -cvf test.tar) && cp -f test.tar /home/.
???
?? ?#1) cpio從find的結(jié)果中讀取文件名,將其打包壓縮后發(fā)送到./dest/dir(目標目錄)。
?? ?#2) cpio的選項介紹:
?? ?#?? ?-d:創(chuàng)建需要的目錄。
?? ?#?? ?-a:重置源文件的訪問時間。
?? ?#?? ?-m:保護新文件的修改時間。
?? ?#?? ?-p:將cpio設(shè)置為copy pass-through模式。
?? ?/> find . -name "*" | cpio -dampv ./dest/dir
總結(jié)
以上是生活随笔為你收集整理的Linux Shell常用技巧(十)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux Shell常用技巧(九)
- 下一篇: Linux Shell常用技巧(十一)