【shell脚本练习】网卡信息和简单日志分析
来源:互联网 发布:协作机器人 知乎 编辑:程序博客网 时间:2024/05/17 05:51
题目
1、写一个脚本getinterface.sh,脚本可以接受参数(i,I,a),完成以下任务: (1)使用以下形式:getinterface.sh [-i interface|-I IP|-a] (2)当用户使用-i选项时,显示其指定网卡的IP地址; (3)当用户使用-I选项时,显示其后面的IP地址所属的网络接口;(如 192.168.199.183:eth0) (4)当用户单独使用-a选项时,显示所有网络接口及其IP地址(lo除外)2、写一个脚本analyzelog.sh,完成日志分析:(使用函数)(日志文件在课件中)说明:此脚本可以接受选项(i,d,t,a),使用格式:analyzelog.sh <-i IP|-d DATE|-t TYPE|-a> 日志文件名 :先判断是访问日志文件还是错误日志文件访问日志文件如下: (1)当用户使用选项-i时,统计出访问日志文件中指定IP地址的访问次数(通常每一行为一次); (2)当用户使用选项-d时,统计出访问日志文件中指定日期(某一天,如:04/May/2015)内每个IP地址访问的次数;如: 192.168.0.1:33 192.168.0.195:17 ... (3)当用户使用选项-t时,统计出访问日志文件中以后缀后指定类型的文件(如.png表示png格式的图片)被访问的次数; (4)当用户使用选项-a时,统计出访问日志文件中每个IP地址访问的次数;错误日志文件日下: (1)当用户使用选项-i时,统计出错误日志文件中指定IP地址的访问次数(通常每一行为一次); (2)当用户使用选项-d时,统计出错误日志文件中指定日期(某一天,如:2015/05/04)内每个IP地址访问的次数;如: 192.168.0.1:33 192.168.0.195:17 ... (3)当用户使用选项-t时,统计出错误日志文件中GET获取失败的次数(就是一行错误信息中包含GET); (4)当用户使用选项-a时,统计出错误日志文件中每个IP地址访问的次数;
文件样例
access.log
192.168.199.178 - - [04/May/2015:11:09:11 -0400] "GET / HTTP/1.1" 200 3698 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "-"192.168.199.178 - - [04/May/2015:11:09:12 -0400] "GET / HTTP/1.1" 200 3698 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "-"192.168.199.178 - - [04/May/2015:11:09:12 -0400] "GET / HTTP/1.1" 200 3698 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "-"192.168.199.178 - - [04/May/2015:11:09:13 -0400] "GET / HTTP/1.1" 200 3698 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "-"192.168.199.244 - - [04/May/2015:11:09:26 -0400] "GET /favicon.ico HTTP/1.1" 404 3652 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36" "-"192.168.199.244 - - [04/May/2015:11:09:30 -0400] "GET /bb HTTP/1.1" 404 3652 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" "-"192.168.199.244 - - [04/May/2015:11:09:30 -0400] "GET /favicon.ico HTTP/1.1" 404 3652 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" "-"192.168.199.244 - - [04/May/2015:11:09:34 -0400] "GET /cc HTTP/1.1" 404 3652 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" "-"192.168.199.244 - - [04/May/2015:11:09:34 -0400] "GET /favicon.ico HTTP/1.1" 404 3652 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" "-"192.168.199.244 - - [04/May/2015:11:09:44 -0400] "-" 400 0 "-" "-" "-"
error.log
015/05/04 11:06:12 [error] 2145#0: *7 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.199.244, server: _, request: "GET /favicon.ico HTTP/1.1", host: "192.168.199.183"2015/05/04 11:07:12 [error] 2145#0: *10 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.199.180, server: _, request: "GET /favicon.ico HTTP/1.1", host: "192.168.199.183"2015/05/04 11:07:12 [error] 2145#0: *10 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.199.180, server: _, request: "GET /favicon.ico HTTP/1.1", host: "192.168.199.183"2015/05/04 11:07:20 [error] 2145#0: *14 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.199.155, server: _, request: "GET /favicon.ico HTTP/1.1", host: "192.168.199.183"2015/05/04 11:07:20 [error] 2145#0: *15 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.199.155, server: _, request: "GET /favicon.ico HTTP/1.1", host: "192.168.199.183"2015/05/04 11:09:26 [error] 2145#0: *47 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.199.244, server: _, request: "GET /favicon.ico HTTP/1.1", host: "192.168.199.183"2015/05/04 11:09:30 [error] 2145#0: *49 open() "/usr/share/nginx/html/bb" failed (2: No such file or directory), client: 192.168.199.244, server: _, request: "GET /bb HTTP/1.1", host: "192.168.199.183"2015/05/04 11:09:30 [error] 2145#0: *49 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.199.244, server: _, request: "GET /favicon.ico HTTP/1.1", host: "192.168.199.183"2015/05/04 11:09:34 [error] 2145#0: *50 open() "/usr/share/nginx/html/cc" failed (2: No such file or directory), client: 192.168.199.244, server: _, request: "GET /cc HTTP/1.1", host: "192.168.199.183"2015/05/04 11:09:34 [error] 2145#0: *50 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.199.244, server: _, request: "GET /favicon.ico HTTP/1.1", host: "192.168.199.183"
作答
第一题
#!/bin/bash#test success in centos6 #orangleliuhelptext="unknow options You can use: getinterface.sh [-i interface|-I IP|-a]"while getopts "i:I:a" argdo case $arg in i) #get arg value echo "$OPTARG IP:"`ifconfig $OPTARG|grep -E "inet "|cut -d: -f2|cut -d" " -f1` ;; I) echo "$OPTARG Interfacei:" `ifconfig |grep -B 1 $OPTARG|head -1|cut -d" " -f1` ;; a) echo -e "All interface except lo is: \n" ifconfig -a | grep -A 1 '^[^[:space:]]\{1,\}' | grep -v -E '(\<lo\>|\b127.0.0.1\b)' ;; *) #unknow arg echo $helptext exit 1 ;; esacdone
第二题
注意的几个地方
* 正则判断ip合法性
* 判断时间格式合法
* 函数的格式
#!/bin/bash#file:analyzelog.sh author:orangleliuhelptext="options is missing Please use: analyzelog.sh <-i IP|-d DATE|-t TYPE|-a> filename"#get last parmater value, that is filenamefilename=${BASH_ARGV[0]}#file chargeif [ ! "$filename" == "" ];then echo "analyze file is $filename"elif [ ! -e $filename ];then echo "file not existed" exit 1fi#funcitonaccess_i(){ if echo "$1" | egrep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' &> /dev/null; then num=$(cat access.log|awk '{print $1}'|grep "$1"|wc -l) echo "IP $1 access count is $num" else echo "$1 is invalid ip" exit 1 fi}access_d(){ res=$(cat access.log|grep "$1"|cut -d" " -f1|sort |uniq -c |awk '{print $2,$1}') echo "accessIP count" echo -e -n "$res"}access_t(){ num=$(cat access.log|awk '{print $7}'|grep -E "\.$1"|wc -l) echo ".$1 access count is $num"}access_a(){ res=$(cat access.log|cut -d" " -f1|sort|uniq -c |awk '{print $2,$1}') echo "every ip access count:" echo "$res"}error_i(){ if echo "$1" | egrep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' &> /dev/null; then num=$(cat error.log|awk -F"[,:]" '{print $7}'|grep $1|wc -l) echo "IP $1 error count is $num" else echo "$1 is invalid ip" exit 1 fi}error_d(){ if date -d "$1" > /dev/null 2>&1 ; then res=$(cat error.log|awk -F"[,:]" '{print $1,$7}'|grep "$1"|sort|uniq -c|awk '{print $4,$1}') echo "errorIP count" echo -e -n "$res" else echo "$1 is invalid date formate" exit 1 fi}error_t(){ num=$(cat error.log|awk -F"[\"]" '{split($4,g," ");print g[1]}'|grep "GET"|wc -l) echo "GET error requests count is $num"}error_a(){ res=$(cat error.log|awk -F"[,:]" '{print $7}'|sort|uniq -c|awk '{print $2,$1}') echo "every ip error count:" echo "$res"}#mainif [ "$filename" == "access.log" ];then case "$1" in -i) access_i $2 ;; -d) access_d $2 ;; -t) access_t $2 ;; -a) access_a ;; *) echo $helptext ;; esacelif [ "$filename" == "error.log" ];then case "$1" in -i) error_i $2 ;; -d) error_d $2 ;; -t) error_t ;; -a) error_a ;; *) echo $helptext ;; esacelse echo "file not existed"fi
2 0
- 【shell脚本练习】网卡信息和简单日志分析
- 网卡信息和简单日志分析
- Shell脚本简单练习
- shell脚本的简单练习
- 简单的shell脚本练习
- 日志分析的shell脚本
- 自定义shell脚本采集日志信息
- shell脚本日志的简单实现
- 用shell脚本分析Nginx日志
- Shell日志分析之应用日志分析脚本上
- Shell日志分析之应用日志分析脚本下
- 【脚本练习】shell脚本
- 初级bash-shell脚本编写和练习
- 简单的备份日志和自动重启tomcat的shell脚本
- 利用shell脚本对游戏日志信息的提取
- shell脚本自动清理服务器日志、图片等信息
- shell 脚本练习。笔记
- shell脚本程序练习
- Leetcode: Binary Search Tree Iterator
- scala学习第十三章 集合
- Kindeditor
- 五种 JSP页面跳转方法详解
- (转载)如何设计一款优秀的软件架构
- 【shell脚本练习】网卡信息和简单日志分析
- 古典小说大全
- poj S-Trees 1105 (二叉树模拟)
- perl 监控端口
- POJ 1269 Intersecting Lines(判断两直线的位置关系)
- 初学软工——需求分析
- 【读书有感】——《番茄工作法图》
- oracle 给新增字段加中文备注
- Android中处理崩溃异常