shell脚本篇(1)

来源:互联网 发布:编辑midi的软件 编辑:程序博客网 时间:2024/06/05 10:28

这两天老大让写脚本统计平均相应时间。然后跑脚本对比相应数据。
虽然我自以为ubuntu用的不错。但是感觉完成shell的编写挺难的(我之前用的时候现查先学,现在忘完了。。。)这里总结一下。下次希望能快速解决问题。

这个主要用到了awk这个神器。
awk我之前有用到过。并且自己写一个脚本统计history里面使用频率最高的linux指令。
这里就不说了。

项目第一步:看数据。
文件名字就叫 171010logs 吧

[ 171010 01:00:00 web:1000] 200 GET /hello/world/1/2/3/4/5/6 (10.10.10.10) android.12.3.3 abcde ssab 10.22ms
[ 171010 00:11:00 web:1000] 200 GET /hello/world/1/2/3/4/5/ (10.10.10.10) android.12.3.3 abcde ssab 10.23ms
[ 171010 00:00:10 web:1000] 200 GET /hello/world/1/2/3/4/ (10.10.10.10) android.12.3.3 abcde ssab 12.24ms
[ 171010 00:00:00 web:1000] 200 GET /hello/world/1/2/3/5/6 (10.10.10.10) android.12.3.3 abcde ssab 6.22ms

数据是模拟的。这里根据空格进行不同的列,我只需要最后一列。而且我只要hello/world/1/2/3/4/5/6 这种的。 如果是hello/world/1/2/3/4/5/7 这种要刨除掉。

脚本怎么写?

step1 :肯定要先获取文件名字。

#!/bin/bashFILENAME="$1"echo -n 'filename='$FILENAME' ' >> home/guo/output.txt

为啥要这么写?我本来只写了cat | 171010logs 直接就把文本抓出来了。但是如果换一个文件呢?日志有上万个。不能一个一个改吧 所以我用FILENAME=“$1”来获取当前的文件名。然后输出。这里我用了echo -n ,echo是输出,-n是不换行,后面空了两格是当做一个空格使用。 >> 追加的意思,这里我追加到了output.txt文件中。

step2:获取文件中的内容,根据条件输出

#!/bin/bashFILENAME="$1"echo -n 'filename='$FILENAME' ' >> home/guo/output.txtcat $FILENAME | awk '{if($0~"4/5/6") print}' 

cat 获取文件中的内容
awk是按行读取的,一次读取一行,其中$0 是一行的内容。默认切割是空格。按空格切分之后,第一列是$1,第二列是$2,第三列是$3.以此类推,最后一列是$NF

awk ‘{if($0~”4/5/6”) print}’ 这一列的意思是如果一行里面如果包含”4/5/6”,就输出。

step3.接下来是统计平均值

#!/bin/bashFILENAME="$1"echo -n 'filename='$FILENAME' ' >> home/guo/output.txtcat $FILENAME | awk '{if($0~"4/5/6") print}' | awk -F" " 'BEGIN{sum=0;count=0;}{split($NF,a,"ms");sum+=a[1];count++;}END{if(count!=0) printf("sum=%f,count=%d,avg=%f\n",sum,count,sum/count);else printf("sum=0,count=0,avg=0\n") fi}' >> home/guo/output.txt

这段代码有点长,我们一点一点看。
上面已经把要留下的行输出出来了,这里要开始统计平均值了。awk -F 是按什么进行拆分,这里用的是空格。 设定一个起始值,sum,count让它们为0,split是进行拆分,

split( String, A, [Ere] )传入的字符串,【Ere】是按照什么进行拆分,中间的A是返回的结果。

这里为什么用$NF而不是$11,是因为我在后面发现数据并不是归整的。里面有的会缺少参数?而最后一个一直都是..ms,所以我就直接用最后一列了。

切分之后,我只取第一个数,sum += a[1],然后计数加一次,这里还要加一个判断,如果count不为0才能继续执行,否则会出现除以0的情况。然后就打印结果就行了。注意要用;隔开。

这只是完成了一个文件的写入,如果是多个文件呢?

for i in `cd /hello/world/1/2/3/ ; ls -l| awk "{if(\$9~"123\*\.2017") print}"|awk '{print \$9}'``;do ./out.sh /a/b/c/d/$i; echo "$i";done

另外再加一点:正则非贪婪模式 file.{-}. 意思是匹配file…..匹配到 . 为止。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 被小兔子咬了怎么办 打老鼠被老鼠咬了了怎么办 制作棒棒糖时木棍翘起怎么办 兔子被打后怕我怎么办 兔子后腿摔断了怎么办 兔子腿骨头断了怎么办 减肥老是控制不住吃怎么办 不爱吃主食爱吃零食怎么办 猫咪奶涨的很硬怎么办 斩魂技能乱加的怎么办 狗狗不吃东西还拉稀怎么办 狗狗拉稀不吃饭怎么办 狗狗几天不吃东西怎么办 狗狗不吃不喝怎么办 拖鞋洗了有臭味怎么办 拖鞋湿水了很臭怎么办 棉被上渗了酸奶怎么办 酸奶弄在衣服上怎么办 孩子把褥子尿湿怎么办 小孩尿过的褥子怎么办 包包放着发霉了怎么办 被套盖久了发黄怎么办 小白鞋里面发霉怎么办 棉被淋了一点雨怎么办 苹果手机被拉进电话群怎么办 墙上的插座烧了怎么办 富士康早退4分钟怎么办 我老婆起泡疹腿剌痛睡不着了怎么办 oppo耳机孔坏了怎么办 魅族耳机口坏了怎么办 控制线的报验资料怎么办 人失踪报警派出所不管怎么办 铁板的货架久了怎么办 干镀锌让环保查了怎么办 水管软管生锈了拧不动怎么办 镀锌管会生锈吗.怎么办 冷镀锌钢管生锈了怎么办 卖了过期的东西怎么办 喝到了假的饮料怎么办 烧汤总是溢锅怎么办 脚踩垃圾桶坏了怎么办