shell 練習題
阿新 • • 發佈:2018-12-03
1、按照日期格式每天生成一個檔案(xxxx-xx-xx),比如:2017-12-28.log ,並把負載 磁碟 記憶體資訊寫入到這個檔案;
#!/bin/bash
d=`date -d "-1 day" +%Y-%m-%d`
logfile=$d.log
df -h > $logfile
free -m > $logfile
w > $logfile
2:分析日記需求,統計access.log的IP地址訪問量; 注意:awk預設是以空格 或 tab 為分隔符的;
[root@localhost_002 shell2]# tail /usr/local/nginx/logs/access.log
127.0.0.1 - - [06/Nov/2018:11:58:49 +0800] "CONNECT www.test.com:443 HTTP/1.1" 400 172 "-" "-"
192.168.149.135 - - [06/Nov/2018:12:05:41 +0800] "GET / HTTP/1.1" 200 12 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
192.168.149.188- - [06/Nov/2018:12:05:41 +0800] "GET /favicon.ico HTTP/1.1" 404 570 "https://www.test.com/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
192.168.149.134
由上可知,access日記的第一列是顯示的IP地址,我們可以使用awk來過濾,然後在用sort 排序,在用uniq去重(去重之前需要排序),然後再用sort排序;
awk '{print $1}' /usr/local/nginx/logs/access.log |sort -n |uniq -c |sort -n |head -n5
[root@localhost_002 shell2]# awk '{print $1}' /usr/local/nginx/logs/access.log |sort -n|uniq -c|sort -nr|head -n5
115 127.0.0.1
38 192.168.149.135
1 192.168.149.129
當然,有時候也還有需求,需要打印出來上一分鐘內的IP地址訪問量;
分析:怎麼做,首先需要先用變量表示出來上一分鐘的日記,可以用 time=date -d "-l min" +%H:%M
然後在日記裡用grep來過濾出來上一分鐘的; tail access.log|grep '$time'
然後用awk來列印IP地址哪一行(即第一行) tail access.log|grep '$time'|awk '{print $1}'|sort -n|uniq -c
首先排序然後再使用uniq -c去重後會顯示兩列,如上 重複次數 IP地址 然後 再列印第二行即可;當然也可以用head指定列印多少行;
time=`date -d "-1 min" +%H:%M` ; tail access.log|grep "$time"|awk '{print $1}'|sort -n|uniq -c|awk '{print $2}'|head -n2
[root@localhost_002 ~]# time=`date -d "-1 min" +%H:%M` ; tail /usr/local/nginx/logs/access.log|grep "$time"|awk '{print $1}'|sort -n|uniq -c|awk '{print $2}'|head -n2
127.0.0.1
當然,也可以寫成for的形式;
#!/bin/bash
time=`date -d "-1 min" +%H:%M`
for i in `tail -n5000 access.log|grep "$time"|awk '{print $1}'|sort -n|uniq -c|sort -nr|awk '{print $2}'`
do
echo $i >> /tmp/ip.list
done