1. 程式人生 > >每天練習50個shell

每天練習50個shell

1、統計日誌每天IP訪問量前十

awk '{print $1}' 1.log | sort -n | uniq -c | sort -n

解釋:
(1)awk 命令在分段方面比較有優勢,這裡的{print $1}將第一段打印出來,awk可以用-F指定分隔符,如果不指定分隔符,預設就以空白字元(比如空格、tab等),本題中,IP地址就是第一段。
(2)sort 命令就是排序,-n選項表示以數字的形式排序。如果不加-n,則以ASCII排序,本題的IP地址用數字的形式排序更易區分。
(3)uniq 命令用來去重複,一個文字如果有多行內容是一模一樣的,就使用uniq命令將相同的內容刪除,只保留一行。-c選項作用是計算重複的行數。所以,uniq -c 的作用正好就統計了ip的訪問量。不過,要注意,uniq去重要在排序之後進行。
(4)最後的sort -n意思是按訪問量大小來排序,請求量越大的ip排在越後面。如果加一個-r選項,sort -nr,就是倒序排序。
或者

awk '{sum[$1]+=1};END{for(a in sum)print(sum[a],a)}' 1.log | sort -nr|head -n 5

解釋:
這條命令中$1 就表示日誌中的IP地址,用IP地址作為陣列的下標,每發現一個相同的IP地址,就統計數量加1;當awk遍歷日誌檔案1.log 完畢,再迴圈輸出陣列 sum 的結果,要注意陣列的下標是 ip地址。
後面的 head -n 5 是為了輸出出現訪問次數最高的5個訪問ip地址。

2.計算linux系統所有程序佔用記憶體大小和
top或者ps可以獲取每個程序大記憶體使用大小。獲得大小之後,通過一個迴圈計算他們的和了。

grep Pss /proc/[0-9]*/smaps | awk '{sum+=$2};END{print sum}'

(1)grep 命令可以遍歷目錄裡的檔案,然後將符合匹配字元的行抓取出來;
(2)awk 命令遍歷grep 輸出的結果,統計程序使用記憶體的和。
(3)在 /proc 目錄下,有很多和程序有關的資料,讀者可以自己去研究一下。
需要注意的是,全部程序佔用的記憶體並不等於 free 命令所顯示的 “used memory”,因為“used memory”不僅包含了程序所佔用的記憶體,還包含cache/buffer以及kernel動態分配的記憶體等等

3.批量修改.txt檔案未.txt.bak,並打包所有的.bak檔案為123.tar.gz,然後再批量還原檔名。

#用到的命令:
find / -maxdepth 1 -type f -name "*.txt" > /tmp/file.txt
#迴圈逐行讀取/tmp/file.txt檔案修改檔名為txt.bak
while read line;
do
mv $line $line.bak
done</tmp/file.txt
#壓縮打包
d='data +%Y%m%d%H%M%S'
mkdir /tmp/123$d
for f in 'cat /tmp/file.txt'
do
cp $f.bak /tmp/123
$d
done
cd /tmp
tar czf 123.tar.gz ./123_$d
for f in 'cat /tmp/file.txt';
do
mv $f.bak $f
done

(1)如果只是遍歷目錄,找出某種檔案,然後修改一下檔名,其實一條命令就可以搞定:

find /usr/local/sbin/work -type f -name "*.txt" -print0 | xargs -d '\0' mv {} {}.bak

要注意,find 命令的查詢路徑需要使用絕對路徑,不要用相對路徑。如果用 xargs 命令接在後面,則用 -print0 選項,將某些包含空格的特殊檔名,也包含在內,不會處理錯誤。

(2)指令碼中的 while 迴圈這種方式其實也是很常見的,將結果臨時儲存在一個檔案中,然後再通過while 迴圈讀取處理。
(3)大家看到指令碼中多次使用 /tmp/file.txt 這個檔案了吧。將 .txt 結尾的檔案儲存到一個檔案中,這種辦法就恨到地解決了我們在習題分析中提出的第3個問題啦。
(4)我的所有.txt 結尾的檔案都在 /usr/local/src/sbin/work 目錄。
​ 如果你沒有 .txt 結尾的檔案,可以用下面的命令生成一堆,用來做實驗:

for i in seq 30;do touch $i.txt;done

4.檢測埠服務
判斷本機的80埠是否開啟著。

檢測指令碼:
cat check_80.sh

#!/bin/bashbr/>ma="[email protected]"
if netstat -lntp | grep -q ':80'
then
exit 0
fi
/usr/local/apache2.4/bin/apachectl restart >/dev/null 2>/dev/null
python /usr/local/sbin/work/mail.py $ma "port_80" "prot 80 down"

n='pgrep -l httpd | wc -l'
echo $n
if [$n -eq 0];then
/usr/local/apache2.4/bin/apachectl start 2>/tmp/http.error
fi

if [-s /tmp/http.error]
then
python /usr/local/sbin/work/mail.py $ma "apache_restart_wrong" "'cat /tmp/http.error'"
fi