博客
关于我
day5-Shell脚本编程精讲(ob14)-2
阅读量:349 次
发布时间:2019-03-04

本文共 7074 字,大约阅读时间需要 23 分钟。

一、for循环

for循环结构 语法

for 变量名 in 变量取值列表do	指令。。。done#另一种for((exp1;exp2;exp2))do	指令。。。done

https://blog.51cto.com/oldboy/711342 《linux下批量修改文件名精彩解答案例分享》

例子13 生产环境批量检查web服务是否正常并且发送相关邮件或手机报警

#!/bin/bash#set -xRETVAL=0SCRIPTS_PATH="/server/scripts"MAIL_GROUP="3xxxxxx1@qq.com 4xxxxxxx8@qq.com"## web detection functionLOG_FILE="/tmp/web_check.log"function Get_Url_Status(){   FAILCOUNT=0for (( i=1 ; $i <= 3 ; i++ ))  do  #跟之前的检测网站一样,检测网页响应    wget -T 20 --tries=2 --spider http://${HOST_NAME} >/dev/null 2>&1    if [ $? -ne 0 ]        then         let FAILCOUNT+=1;    fidone#if 3 times then send mail.  发邮件if [ $FAILCOUNT -eq 3 ]     then        RETVAL=1       NOW_TIME=`date +"%m-%d %H:%M:%S"`       SUBJECT_CONTENT="http://${HOST_NAME} service is error,${NOW_TIME}."       for MAIL_USER in $MAIL_GROUP         do             echo "send to :$MAIL_USER ,Title:$SUBJECT_CONTENT" >$LOG_FILE            mail -s "$SUBJECT_CONTENT " $MAIL_USER <$LOG_FILE        doneelse      RETVAL=0fireturn $RETVAL}#func end.[ ! -d "$SCRIPTS_PATH" ] && {     mkdir -p $SCRIPTS_PATHEOF}#定义要检测的网站[ ! -f "$SCRIPTS_PATH/domain.list" ] && {     cat >$SCRIPTS_PATH/domain.list<

例子 批量创建用户 并附上随机密码

userchars="test"passfile="/tmp/user.log"for num in `seq 3` do   useradd $userchars$num   passwd="`echo "date $RANDOM"|md5sum|cut -c3-11`"   echo "$passwd"|passwd --stdin $userchars$num   echo  -e "user:$userchars$num\tpasswd:$passwd">>$passfile   #sleep 1doneecho ------this is oldboy trainning class contents----------------cat $passfile

在这里插入图片描述

接上回的shell内容。

范例7。分析图片服务日志。把日志(每个图片访问次数*图片大小的总和〉排行,取top10,也就是计算每个url的总访问大小

说明。这个功能可以用于网站流窒带宽很高,分析自己的服务器哪些元素占用流量大,进而进行优化栽剪图片,压缩js等措施。 日志信息如下:

59.33.26.105 - - [08/Dec/2010:15:43:55 +0800] "GET //back/upload/course/2010-10-25-23-48-59-048-18.jpg HTTP/1.1" 200 44286 "http://oldboy.blog.51cto.com/static/web/column/17/index.shtml?courseId=43" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"59.33.26.105 - - [08/Dec/2010:15:43:55 +0800] "GET /back/upload/teacher/2010-08-06-11-39-59-0469.jpg HTTP/1.1" 200 10850 "http://oldboy.blog.51cto.com/static/web/column/17/index.shtml?courseId=43" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"59.33.26.105 - - [08/Dec/2010:15:43:55 +0800] "GET /back/upload/teacher/2010-08-30-13-57-43-06210.jpg HTTP/1.1" 200 11809 "http://oldboy.blog.51cto.com/static/web/column/17/index.shtml?courseId=43" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"59.33.26.105 - - [08/Dec/2010:15:43:55 +0800] "GET /static/web/coursesort/5.shtml HTTP/1.1" 200 255 "http://oldboy.blog.51cto.com/static/web/column/17/index.shtml?courseId=43" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"59.33.26.105 - - [08/Dec/2010:15:43:55 +0800] "POST /cms/cmtweb!getCommentListBySource.action HTTP/1.1" 200 433 "http://oldboy.blog.51cto.com/static/web/column/17/index.shtml?courseId=43" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/images/photos/2.jpg HTTP/1.1" 200 11299 "http://oldboy.blog.51cto.com/static/web/column/17/index.shtml?courseId=43" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/images/photos/2.jpg HTTP/1.1" 200 11299 "http://oldboy.blog.51cto.com/static/web/column/17/index.shtml?courseId=43" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/images/photos/2.jpg HTTP/1.1" 200 11299 "http://oldboy.blog.51cto.com/static/web/column/17/index.shtml?courseId=43" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"59.33.26.105 - - [08/Dec/2010:15:44:02 +0800] "GET /static/flex/vedioLoading.swf HTTP/1.1" 200 3583 "http://oldboy.blog.51cto.com/static/flex/AdobeVideoPlayer.swf?width=590&height=328&url=/[[DYNAMIC]]/2" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"124.115.4.18 - - [08/Dec/2010:15:44:15 +0800] "GET /?= HTTP/1.1" 200 46232 "-" "-"124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/web_js.js HTTP/1.1" 200 4460 "-" "-"124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/jquery.lazyload.js HTTP/1.1" 200 1627 "-" "-"124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/common.js HTTP/1.1" 200 1861 "-" "-"124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/default.js HTTP/1.1" 200 2686 "-" "-"124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/cookieUtil.js HTTP/1.1" 200 955 "-" "-"124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/jquery-jquery-1.3.2.min.js HTTP/1.1" 200 57254 "-" "-"124.115.4.18 - - [08/Dec/2010:15:44:26 +0800] "GET /static/js/addToCart.js HTTP/1.1" 200 6417 "-" "-"123.122.65.226 - - [08/Dec/2010:15:44:43 +0800] "GET /static/flex/vedioLoading.swf HTTP/1.1" 304 - "http://oldboy.blog.51cto.com/static/flex/VideoCenter.swf?url=/[[DYNAMIC]]/2" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"123.122.65.226 - - [08/Dec/2010:15:44:43 +0800] "POST /messagebroker/amf HTTP/1.1" 200 183 "http://oldboy.blog.51cto.com/static/flex/VideoCenter.swf?url=/[[DYNAMIC]]/4" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"123.122.65.226 - - [08/Dec/2010:15:44:43 +0800] "POST /messagebroker/amf HTTP/1.1" 200 117 "http://oldboy.blog.51cto.com/static/flex/VideoCenter.swf?url=/[[DYNAMIC]]/4" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"

需要的数据是(图中标红的)

在这里插入图片描述
最终结果是某个文件的访问次数和消耗的流量,所以考虑建立以文件名为索引的两个数组,一个存储访问次数,一个保存消耗的流量,这样当使用awk按行遍历文件时,对次数数组+1,同时对流量数组进行文件大小的累加,等文件扫描完成。再遍历输出两个数组既可以得到该文件的反间次数和总的流量消耗。

#{array_num[$7]++ 数组第七列的,只要出现一次相同的文件名那就++  , 这个就相当于访问次数了#arrzy_size[$7]+=$10 ,把第七列相同的,将后面的$10进行加和。 相当于总访问量 awk '{array_num[$7]++;array_size[$7]+=$10}END{for(x in array_num){print array_size[x],array_num[x],x}}' log.txt | sort -nr -k1 | head -n 10

在这里插入图片描述

二、shell函数

函数名(){   	指令...	return n}function 函数名(){   	指令...	return n}

在这里插入图片描述

#加载函数. ./func-1.sh#提示:可以用source或.(点号)来加载脚本function.sh中的命令或变量参数等。

略。。。

三、shell脚本调试

使用dos2unix命令处理脚本

从windows编辑的脚本到linux下的格式可能会出现格式问题,可用cat -A filename.txt来查看情况。

可用dos2unix来格式化处理,处理完之后可发现 ^M 消失了
在这里插入图片描述

使用bash命令参数调试

sh [-nvx] scripts.sh-n:不会执行该脚本,仅查询脚本语法是否有问题,并给出错误提示。-v:在执行脚本时,先将脚本的内容输出到屏幕上,如果有错误,也会给出错误提示。-x:将使用的脚本内容显示到屏幕上,这是对调试很有用的参数。或者直接在脚本中使用 set -x

四、shell编程规范

变量命名规范

统一、全部大写或者驼峰命名引用时: ${APACHE_ERR_NUM} 或"${APACHE_ERR_NUM}"

函数命名

函数命名使用单词首字母大写,如CreateFile 。 或驼峰命名 createFile建议函数定义时在函数名前加上 function保留字,如:function testA(){	echo "test aaaaa"}testA()

引用符号使用规范

在这里插入图片描述

配置规范

在这里插入图片描述

在这里插入图片描述

补充

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
19 对于java程序脚本等需要环境变量的,在写脚本前,最好通过export重新声明环境变量,以免在定时任务等场合使用出现问题。
这里有个参考例子:https://blog.csdn.net/qq_19175749/article/details/50992242

END

你可能感兴趣的文章
NHibernate异常:No persister for的解决办法
查看>>
Nhibernate的第一个实例
查看>>
NHibernate示例
查看>>
nid修改oracle11gR2数据库名
查看>>
NIFI1.21.0/NIFI1.22.0/NIFI1.24.0/NIFI1.26.0_2024-06-11最新版本安装_采用HTTP方式_搭建集群_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_插入时如果目标表中已存在该数据则自动改为更新数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0058
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0_Postgresql和Mysql同时指定库_指定多表_全量同步到Mysql数据库以及Hbase数据库中---大数据之Nifi工作笔记0060
查看>>
NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0最新版本安装_配置使用HTTP登录_默认是用HTTPS登录的_Https登录需要输入用户名密码_HTTP不需要---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增加修改实时同步_使用JsonPath及自定义Python脚本_03---大数据之Nifi工作笔记0055
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现update数据实时同步_实际操作05---大数据之Nifi工作笔记0044
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>