天天看點

Linux Shell常用技巧(十)

二十. 通過管道組合shell指令擷取系統運作資料:

   1. 輸出目前系統中占用記憶體最多的5條指令:

   #1) 通過ps指令列出目前主機正在運作的所有程序。

   #2) 按照第五個字段基于數值的形式進行正常排序(由小到大)。

   #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指令輸出所有程序的資料,-o選項後面的字段清單列出了結果中需要包含的資料列。

   #2) 将ps輸出的title行去掉,grep -v pid表示不包含pid的行。

   #3) 基于第一個域字段排序,即pcpu。n表示以數值的形式排序。

   #4) 輸出按cpu使用率排序後的最後20行,即占用率最高的20行。

   /> ps -e -o pcpu,pid,user,sgi_p,cmd | grep -v pid | sort -k 1n | tail -20

   3. 擷取目前系統實體記憶體的總大小:

   #1) 以兆(mb)為機關輸出系統目前的記憶體使用狀況。

   #2) 通過grep定位到mem行,該行是以作業系統為視角統計資料的。

   #3) 通過awk列印出該行的第二列,即total列。

   /> free -m | grep "mem" | awk '{print $2, "mb"}'

   1007 mb

二十一. 通過管道組合shell指令進行系統管理:

   1. 擷取目前或指定目錄下子目錄所占用的磁盤空間,并将結果按照從大到小的順序輸出:

   #1) 輸出/usr的子目錄所占用的磁盤空間。

   #2) 以數值的方式倒排後輸出。

   /> 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指令去執行,進而将所有20110311*.output改為20110311*.output

    /> find ./ -name "*.output" -print  | sed -e 's/.\///g' -e 's/20110311\(.*\)/mv & 20110310\1/g' | bash

   3. 統計目前目錄下檔案和目錄的數量:

   #1) ls -l指令列出檔案和目錄的詳細資訊。

   #2) ls -l輸出的詳細清單中的第一個域字段是檔案或目錄的權限屬性部分,如果權限屬性部分的第一個字元為d,

   #    該檔案為目錄,如果是-,該檔案為普通檔案。

   #3) 通過wc計算grep過濾後的行數。

   /> 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查找結果的第一個字段,即pid字段。

   #4) 上面的三個組合指令是在反引号内被執行的,并将執行的結果指派給數組變量${k}。

   #5) kill方法将殺掉數組${k}包含的pid。

   /> kill -9 ${k}=`ps -t pts/1 | grep -v pid | awk '{print $1}'`  

   5. 将查找到的檔案打包并copy到指定目錄:

   #1) 通過find找到目前目錄下(包含所有子目錄)的所有*.txt檔案。

   #2) tar指令将find找到的結果壓縮成test.tar壓縮封包件。

   #3) 如果&&左側括号内的指令正常完成,則可以執行&&右側的shell指令了。

   #4) 将生成後的test.tar檔案copy到/home/.目錄下。

   /> (find . -name "*.txt" | xargs tar -cvf test.tar) && cp -f test.tar /home/.

   #1) cpio從find的結果中讀取檔案名,将其打包壓縮後發送到./dest/dir(目标目錄)。

   #2) cpio的選項介紹:

       # -d:建立需要的目錄。

       # -a:重置源檔案的通路時間。

       # -m:保護新檔案的修改時間。

       # -p:将cpio設定為copy pass-through模式。

   /> find . -name "*" | cpio -dampv ./dest/dir

最後需要說明的是,該篇blog中絕大多數的示例來自于網際網路,是本人經過一天左右的時間收集和整理之後篩選出來的,其中注釋部分是我在後來添加的,以便于我們閱讀時的了解。如果今後再發現更好更巧妙的shell組合指令,本人将持續更新該blog。如果您有确實非常不錯的shell指令組合,且願意和我們在這裡分享,可以直接放在回複中,本人将對該篇blog始終保持重點關注。