一、主分析脚本(StatisticsNum.sh)如下

#!/bin/bash
echo "get cuurnt path"
basePath=$(cd $(dirname $0);pwd)
echo $basePath
cd $basePath# define variables
# 统计起始时间
BEGIN_TIME=$1
# 统计截止时间
END_TIME=$2
#GitLab服务器分支存储默认路径,如有变更请同步修改
GITDATA_PATH="/var/opt/gitlab/git-data/repositories"# 初始化相关路径
mkdir -p $basePath/report
mkdir -p $basePath/log# 定义统计总天数函数(参数:起始日期、截止日期)
function CountEffectiveDays(){BEGIN_SECONDS=$(date -d "$1" "+%s")END_SECONDS=$(date -d "$2" "+%s")DIFF_SECONDS=$[$END_SECONDS-$BEGIN_SECONDS]expr $DIFF_SECONDS / 86400
}# 定义计算时保留小数函数(参数:分子、分母、小数位数)
function KeepDecimal(){# 分子MEMBER=$1# 分母DENMOINATOR=$2# 小数位数DECIMAL_PLACES=$3cat $basePath/KeepDecimal.sh > $basePath/countfile.shif [ ! -n "$DECIMAL_PLACES" ] ;thenDNUMBER="2"echo "$AUTHOR DELETE IS NULL!"fiif  [ ! -n "$DECIMAL_PLACES" ] ;thenDECIMAL_PLACES="2"fised -i "s#2#$DECIMAL_PLACES#g;" $basePath/countfile.sh# 更新表达式COUNTMET=$MEMBER/$DENMOINATORsed -i "s#countmet#$COUNTMET#g;" $basePath/countfile.sh# 返回结果echo $( sh $basePath/countfile.sh)rm -rf $basePath/countfile.sh
}# 计算统计总天数
TOTAL_DAYS=$( CountEffectiveDays $BEGIN_TIME $END_TIME )# 定义记录日志函数
function logger(){printf "%s\n" "$*" >> $basePath/log/StatisticsNum.log
}# define add message function
function ShowMessage(){echo "规则说明:"echo "提交次数:统计周期内用户提交commit的总次数"echo "日均提交:统计期内用户日均提交commit的次数"echo "文件:统计周期内文件累计修改总数"echo "变更:统计周期累计新增和修改总行数之和"echo "删除:统计周期内删除的总行数"echo "有效变更:统计周期内新增和变更的总行数"echo "日均变更:统计周期内日均有效变更行数"echo "变更度:变更/提交"echo "修改一行记作增加一行且删去一行"echo "merge操作内容不计入统计范围"echo "Statistics time [$BEGIN_TIME  $END_TIME)"echo "Statistics total days $TOTAL_DAYS"echo "Statistics total persons $TOTAL_PERSION"
}# 文本转化格式化HTML函数(参数:名称 账号 提交次数 文件 变更 删除 有效变更 变更度 )
function HTMLFormat(){HTML_PATH="$basePath/report/RESULT.html"echo "<tr>" >> $HTML_PATHecho "<th align="center">$1</th>" >> $HTML_PATHecho "<th align="center">$2</th>" >> $HTML_PATHecho "<th align="center">$3</th>" >> $HTML_PATHecho "<th align="center" style="color:green">$4</th>" >> $HTML_PATHecho "<th align="center">$5</th>" >> $HTML_PATHecho "<th align="center">$6</th>" >> $HTML_PATHecho "<th align="center">$7</th>" >> $HTML_PATHecho "<th align="center">$8</th>" >> $HTML_PATHecho "<th align="center" style="color:green">$9</th>" >> $HTML_PATHecho "<th align="center">${10}</th>" >> $HTML_PATHecho "</tr>" >> $HTML_PATH
}echo "get contents and subdirectory path"
cd $GITDATA_PATH
# 1.遍历GitLab服务器全部可用群组
for file in $GITDATA_PATH/*
doif test -f $filethenecho "$file is a file"elseecho $filecd $file# 2.遍历群组下的全部库for sonfile in $file/*doif test -f $sonfilethenecho "$sonfile is a file"elsecd $sonfile# 3.遍历不同库下的全部分支git branch -a | sed 's/.//' | sed -e 's/^/pre /' | awk -F" " '{print $2}' | while read BRANCHNAMEdo# 获取单分支的相关使用信息源数据echo $BRANCHNAME# 获取有效用户列表git log $BRANCHNAME --no-merges --pretty=format:"%ai,%cn:%s" --since="$BEGIN_TIME" --until="$END_TIME" | \awk -F"," '{print $2}' | \awk -F":" '{print $1}' > $basePath/USERLIST# 4.遍历该分支下每个用户的提交信息sort $basePath/USERLIST | uniq | while read USERdo# 5.获取并格式化汇总元数据git log $BRANCHNAME --no-merges --author="$USER"  --stat  --since="$BEGIN_TIME" --until="$END_TIME" | \grep changed | \awk '/insertion|deletion/' | \while read LINEdoecho "$USER $LINE" >> $basePath/CollectMetadataecho "时间:$(date "+%Y.%m.%d-%H.%M.%S");库:$sonfile;分支:$BRANCHNAME;用户:$USER;单次源日志:$LINE;" >> $basePath/log/StatisticsNum.logdonedonedonefidonefilogger "Run by user " $(id -un) "at " $(/bin/date)
doneecho "information Statistics And Generate RESULT"
# 添加表头信息
echo "名称 账号 提交次数 日均提交 文件 变更 删除 有效变更 日均变更 变更度" > $basePath/report/RESULT# HTML格式化头
echo "<table border="1">" > $basePath/report/RESULT.html
HTMLFormat 名称 账号 提交次数 日均提交 文件 变更 删除 有效变更 日均变更 变更度# 遍历获取有效用户列表
cat $basePath/CollectMetadata | awk '{print $1}' | sort | uniq | while read USER
do# 获取用户修改文件数FILESSUM=$( cat $basePath/CollectMetadata | grep -w $USER | awk '{print $2}' | awk '{sum+=$1}END{print sum}' )# 获取用户名称USER_NAME=$( cat $basePath/userlist | grep -w $USER | awk '{print $2}' | head -1 )if [ ! -n "$USER_NAME" ] ;thenUSER_NAME="已清除账号"fi# 获取用户变更代码总行数INSERTIONSSUM=$( cat $basePath/CollectMetadata | grep -w $USER | awk -F"insertion" '{print $1}'| awk -F"," '{print $2}' | awk '{sub(/^[ \t]+/,"");print $0}' | awk '{sum+=$1}END{print sum}' )# 获取用户删除代码总行数DELETIONSSUM=$( cat $basePath/CollectMetadata | grep -w $USER | awk -F"," '{print $NF}' | awk -F"deletion" '{print $1}' | grep -v insertion | awk '{sub(/^[ \t]+/,"");print $0}' | awk '{sum+=$1}END{print sum}' )# 获取用户提交总次数COMMITNUM=$( cat $basePath/CollectMetadata | grep -w $USER | awk '{a[$1]++}END{for(i in a){print i,a[i] | "sort -r -k 2"}}' | sort -n -b -t" " -r -k2 | awk '{print $2}' )# 美化数据,将空值填充为oif [ ! -n "$FILESSUM" ] ;thenFILESSUM="0"echo "$USER FILESSUM IS NULL!"fiif [ ! -n "$INSERTIONSSUM" ] ;thenINSERTIONSSUM="0"echo "$USER INSERTIONSSUM IS NULL!"fiif [ ! -n "$DELETIONSSUM" ] ;thenDELETIONSSUM="0"echo "$USER DELETIONSSUM IS NULL!"fi# 计算日均提交次数PREDAY_CNUMBER=$( KeepDecimal $COMMITNUM $TOTAL_DAYS 2 )# 计算日均变更(日均变更=变更总数/统计总天数)PREDAY_Eff=$( KeepDecimal $INSERTIONSSUM $TOTAL_DAYS 3 )# 计算变更度(变更度=变更/提交次数)MET=$( KeepDecimal $INSERTIONSSUM $COMMITNUM 2 )# 归集生成最终结果文件echo "$USER_NAME $USER $COMMITNUM $PREDAY_CNUMBER $FILESSUM $INSERTIONSSUM $DELETIONSSUM $INSERTIONSSUM $PREDAY_Eff $MET" >> $basePath/report/RESULTHTMLFormat $USER_NAME $USER $COMMITNUM $PREDAY_CNUMBER $FILESSUM $INSERTIONSSUM $DELETIONSSUM $INSERTIONSSUM $PREDAY_Eff $METlogger "Run by user " $(id -un) "at " $(/bin/date)
done# 获取总人数
TOTAL_ROWS=$( cat $basePath/report/RESULT | awk '{print $1}' | uniq | wc -l )
TOTAL_PERSION=$( expr $TOTAL_ROWS - 1 )
# HTML格式化尾
echo "</table>" >> $basePath/report/RESULT.html
echo "<p>(Statistics TOTAL $TOTAL_PERSION PERSIONS  )<br /></p>" >> $basePath/report/RESULT.html
echo "<p>Statistics time [$BEGIN_TIME  $END_TIME)<br /></p>" >> $basePath/report/RESULT.html
echo "<p>Statistics total days $TOTAL_DAYS<br /></p>" >> $basePath/report/RESULT.htmlecho "clean up temp files"
cd $basePath
rm -rf CollectMetadata USERLIST# 格式化展示最终统计分析数据
echo "--------------------------------- EXPLAIN MESSAGES --------------------------------"
ShowMessage
echo "-------------------------------- FORMAT SHOW  DATA --------------------------------"
column -t $basePath/report/RESULT
echo "-------------------------------- FORMAT SHOW  END ---------------------------------"if [ $? -eq 0 ]; thenecho "successed."
elseecho "failed , please check this script ."exit 1
fi

二、计算保留变更度脚本(KeepDecimal.sh)内容如下:

#!/bin/bash
basePath=$(cd $(dirname $0);pwd)
cd $basePathawk 'BEGIN{printf "%0.2f",countmet}'

三、将两个脚本拷贝到GitLab服务器的任意同一目录下

#userlist用户对应一览表
zhangsan    张三
lisi    李四
wangwu  王五

四、传参(开始时间、截止时间)运行脚本:

sh StatisticsNum.sh begintime endtime

-rw-rw-r-- 1 peizhi peizhi    95 12月 27 15:05 KeepDecimal.sh
drwxr-xr-x 2 root   root      31 12月 27 15:06 log
-rw-rw-r-- 1 peizhi peizhi   121 12月 27 15:05 README
drwxr-xr-x 2 root   root      39 12月 27 15:08 report
-rw-rw-r-- 1 peizhi peizhi  8443 12月 27 15:21 StatisticsNum.sh
-rw-rw-r-- 1 peizhi peizhi 13386 12月 27 15:05 userlist
[root@vm-ghxw-gitlab-h13-8 StatisticsNum]# sh StatisticsNum.sh 2021-12-1 2021-12-28

五、等待完成并展示结果即可

GitLab+Shell用户周期性数据统计分析工具(自动生成HTML格式)相关推荐

  1. python数据统计插件_2016年新版数据统计分析工具IBM SPSS Statistics 24优化版

    IBM SPSS Statistics 24为IBM近期推出的新版数据统计分析软件,是目前各行业主流的数据统计分析工具.IBM SPSS Statistics在调查统计行业.市场研究行业.医学统计.政 ...

  2. oracle 插入表数据时,自动生成ID

    今天因为某些原因,需要把达梦数据库(oracle)里面的一张视图的大量数据某些字段插到另外一张表里面,但是又因为这张视图没有ID,插入表ID又不能为null,这时候就可以在插入的时候自动生成ID,记录 ...

  3. Vs code自动生成Doxygen格式注释

    前言 ​ 程序中注释的规范和统一性的重要性不言而喻,本文就推荐一种在用vscode编写代码时自动化生成标准化注释格式的方法,关于Doxygen规范及其使用可查看博文 代码注释规范之Doxygen. ​ ...

  4. C# 淘宝数据包下载,生成csv格式。可直接通过淘宝助理上传到淘宝店铺

    核心代码: #region 打包下载/// <summary>/// 淘宝数据包下载,生成csv格式.可直接通过淘宝助理上传到淘宝店铺/// </summary>/// < ...

  5. 无需用户输入,Adobe提出自动生成高质量合成图像新方法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 没有用户输入,也能生成高质量的合成图像吗? 编辑:迈威AI研习社 ...

  6. 无需用户输入!Adobe提出自动生成高质量合成图像新方法

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 本文转载自:机器之心  |  作者:He Zhang等 编辑:小舟.杜伟 没有用户输入,也能生 ...

  7. 数据层(DAL)自动生成库

    Data Access Layer Auto Generation Library 源英文文档 <http://www.codeproject.com/KB/aspnet/auto_genera ...

  8. C代码工具--自动生成enum值和名字映射代码

    这年头好像继续做C语言的人不多了,年轻人大多去互联网和移动应用.确实,那两个领域现在来钱快,且总是供不应求.就说刚刚在一个旧同事的微信群里,有人刚放出自己有团队可以做App几分钟,哇塞,好几个人说有项 ...

  9. Spring Boot项目利用MyBatis Generator进行数据层代码自动生成

    概 述 MyBatis Generator (简称 MBG) 是一个用于 MyBatis和 iBATIS的代码生成器.它可以为 MyBatis的所有版本以及 2.2.0之后的 iBATIS版本自动生成 ...

最新文章

  1. 我在美团的这两年,想和你分享
  2. window for jdk install
  3. 2021桓台高考成绩查询,桓台中考成绩查询2021
  4. centos7.7安装mysql8.0_centos7.7 安装 mysql8.0.20
  5. hdu - 4027 Can you answer these queries?
  6. 设计模式08_适配器
  7. java heap space 解决方法_内存溢出错误:java堆空间
  8. matlab interp2插值函数的使用
  9. 怎么打散铺铜_怎么做绵软香甜的黑米糕,不加酵母,加鸡蛋和一碗黑米粉一搅拌...
  10. python学习手册笔记——29.运算符重载
  11. gooflow 自定义流程图
  12. PCB板材的分类和介电常数
  13. Tbschedule参数配置理解
  14. 上海车牌拍牌辅助工具
  15. jenkins:Failed to get hostnam执行启动脚本不执行
  16. git 手动master_git 如何撤销一次remote的master commit?
  17. RabbitMq详解+SpringBoot整合RabbitMq快速入门
  18. linux安装使用jq
  19. BlackHat2020议题之Web缓存投毒
  20. 迅雷下载器无限制版_无敏感_无限速

热门文章

  1. STM32歌唱《孤勇者》(标准库)
  2. DP1363F高度集成的非接触读写芯片 13.56M NFC/RFID读卡器芯片 兼容替代CLRC663
  3. Benji Bananas 与 ApeCoin 一起迈向边玩边赚
  4. PS通过模板批量替换数据转换为PDF
  5. 7 种常用的数据挖掘技术分享
  6. 机器学习、人工智能、深度神经网络和神经网络,四个概念之间有什么关系?
  7. 10 种创新的智慧废弃物管理技术
  8. 专利 | word图片设置为黑白
  9. Sublime与Firefox(火狐)配置livereload插件实现动态实时刷新浏览器
  10. 普元 EOS定时任务实现原理