CreateArtTechnology
/ Blog
Login
最新文章
Java
语言相关
库相关
虚拟机相关
CreateArtTechnology
项目搭建
使用的工具
自研的工具
开源工具
ELK
ElasticSearch
Jenkins
Markdown
GraphQL
Arthas
生产工具
Linux
Nginx
VersionControl
Subversion
Git
Redis
Archiva
Maven
Zookeeper
Spring
SpringBoot
MySql
HBase
Cassandra
容器化
Docker
Kubernetes
服务容器化从零开始
未分类笔记
算法相关
概念相关
豆知识
机器学习
机器学习从零开始
一个简单的shell脚本
12
2019-03-21 15:56:14
生产工具
Linux
## 背景 根据服务器的Access日志,跑出指定id的数据在不同时间段内被访问的次数,以小时为单位。 由于用了很多shell脚本常用的代码,就贴出来,哪天忘了来翻一翻。 ## 思路 问题: - 原日志gzip压缩过 - 原日志量实在过大,直接暴力统计恐怕吃不消 - 不要产生过大的中间文件 - 最好可选天数 - 结果最好能方便转成Excel文件格式 流程: 1. 输入日期参数 2. gzip解压原日志 3. 通过awk只取原日志关键的几个列,包括时间、url 4. 只保留命中名单的qid数据,写入临时文件 5. 按小时统计行数 6. 输出结果 7. 删除临时文件 ### 几个注意的点 **权限** 写完脚本记得设置执行权限,通常`chmod 755`,也就是`-rwxr-xr-x` **数组初始化** `qids=(123 234 345)`批量赋值初始化 **遍历数组** 使用@进行遍历 ```shell for qid in ${qids[@]}; do xxxx done ``` **if判断** `if [ -e "$file" ]; then`判断文件是否存在 **引号** `` `: 反引号,内容会被作为命令语句执行 ` " `:双引号,内容中的变量会展示值 ` ' `:单引号,内容按字符形式展示 **神奇的for** `for hour in {00..23}; do`hour的遍历值会从00(而非0)到23 **格式化输出** `printf`命令才能正常输出转义符`\t`、`\n`等,`echo`不可以 ## 脚本代码 ```shell #!/bin/bash # 初始化一批id qids=(454700085 768241742 649175057 336969105 412856368 358529409 862823433 105083063 1710355007 859276296 878043194 175019718 362546918 176301657 836185098 655466072 543051532 859275697 654053858 470076839 403696879 180940182 651424463 301626014 393345827 654814823 705505137 707216853 794453508 1709076910 420339514 581380584 654715547 860276945 865063287 652229905 1700127438 276006577 184731919 859275293 859149556 270549705 705387724 705809373 1701531776 824149579 1704545352 651253248 147295681 593769541 392163782 488086787 870028601 652259080 794442920 587556924 134273290 1703396501 374666614 1705540957 652385817 325152465 796023815 1705945276 1708216621 327914959 1704599563 760820871 397703019 804110008 600127385 860283674 788933868 796383143) # 接收第一个输入参数作为日期字符串 date_str=$1 # 检查参数,异常则退出 if [ ! $date_str ]; then echo "please enter date yyyy-MM-dd" # 表示异常退出 exit 1 fi echo "[step: start counting $date_str]" # 通过双引号拼接两个文件名 file="/data/wenwen/webapp-question/tomcat-7.0.59/logs/AccessLog.$date_str.gz" tmp_file="/home/snswenwen/lxh/count/qid_access.$date_str" echo "[step: filtering file]" # 通过管道命令和重定向输出,gzip解压、取日期和url列、grep过滤出包含qid的行并append到tmp_file中 # qid_access_pattern这个文件每行是一个qid,grep -f可以同时检查多个模式的匹配情况,相当于检测一行是否包含任意一个qid zcat $file | awk '{print $2,$6}' | grep -f /home/snswenwen/lxh/qid_access_pattern >> $tmp_file echo "[step: counting qids]" result_file="/home/snswenwen/lxh/count/count_result.$date_str" # 循环遍历数组 for qid in ${qids[@]}; do echo "[step: counting $qid]" result=$qid # 按起始的小时从临时文件中统计某qid行数 # grep -e:正则匹配,是为了匹配行首的小时数 # grep -c:输出命中行数 for hour in {00..23}; do count=`grep $qid /home/snswenwen/lxh/count/qid_access.$date_str | grep -e ^$hour: -c` # 拼接字符串 # 原以为使用\t输出结果可以直接复制到excel文件中,后来发现通过远程登录服务器时复制屏幕上的\t会被转成空格 result="$result\t$count" done # 输出到结果文件 printf "$result\n" >> $result_file done echo "[step: removing temp file]" # 删除临时文件 rm $tmp_file echo "[step: counting successfully done]" exit 0 ``` ### 输出结果 省略了一部分 ```shell 454700085 35 18 15 12 11 14 21 23 26 27 26 27 20 39 33 27 26 15 18 14 26 34 46 60 768241742 17 13 3 2 1 4 2 4 7 5 12 5 16 14 13 21 14 14 6 4 11 15 22 30 649175057 34 23 9 5 6 3 14 24 35 41 26 32 22 27 44 57 36 27 27 17 15 32 51 39 336969105 28 29 16 17 13 39 43 47 34 32 40 34 41 45 45 50 51 44 33 56 64 80 70 70 412856368 2 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 3 0 358529409 0 0 0 0 0 3 1 0 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 862823433 37 25 8 17 13 11 32 28 32 30 26 38 18 40 53 43 47 29 19 31 37 43 58 56 105083063 2 0 1 0 0 0 0 0 0 2 1 0 1 2 0 3 1 1 3 2 1 4 4 1 1710355007 77 45 33 5 9 11 24 56 58 60 67 50 54 89 107 101 80 71 47 62 66 85 115 118 ```
发布文章 101
文章被阅读 1817
最近修改
什么是“丝滑”的曲线
2021-12-08 15:19:20
高效空间数据索引R树及其批量加载方法STR简介
2021-09-29 20:33:37
关于分库分表的一些事儿
2021-06-25 11:51:25
获得诺奖的稳定匹配理论之TTC算法与GS算法
2021-03-14 23:04:48
算法小白的机器学习入门实践,从零到上线
2021-01-13 14:28:27
分站宗旨
一站式资料平台,减少重复检索,减少重复采坑。