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…..匹配到 . 为止。
- shell脚本篇(1)
- shell脚本篇一---shell脚本初步
- shell脚本篇二---shell脚本写作
- Shell脚本基础篇
- Shell脚本编程篇
- shell脚本入门篇
- shell脚本符号篇
- shell脚本语法篇
- shell脚本--符号篇
- shell脚本--语法篇
- Shell脚本符号篇
- Shell脚本语法篇
- shell脚本学习-1
- 【SHELL】1 FTP脚本
- shell脚本实例1
- linux shell脚本-1
- Shell脚本笔记 1
- SHELL脚本-1
- 协议编程
- 解决某个RegionServer获取行锁失败[HBase1.1.2]
- 线性代数
- web.xml中<security-constraint>和四种认证类型
- 数据结构实验之排序七:选课名单
- shell脚本篇(1)
- android6.0系统状态栏添加电量百分比
- 利用ab测试工具对Tornado下使用mongodb驱动的性能简单测试分析
- 安卓控件拖动
- . 使用TCP协议编写一个网络程序,设置服务器端的监听端口是8002,当与客户端建立连接后,服务器端向客户端发送数据“Hello, world”,客户端收到数据后打印输出。
- ps 条件动作添加 图层锁定和解锁
- jquery cookie 跨页面 获取值undefined
- 哈尔滨理工大学第七届程序设计竞赛决赛 B 幸运大奖
- 文章标题