shell 練習題

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 - - [06/Nov/2018:12:12:43 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
由上可知,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

 

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