每天練習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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章