有段时间没有接触shell,对命令有些生疏,今天接到统计日志信息的任务,浪费了不少时间,决定还是记录一哈
根据某一列进行去重排序统计并对另一列求和
示例:
4 115223
1 115277
1 115277
2 115223
目标:
115223 6
115277 2
shell脚本:
grep -v '^$' count.log
| awk -F ' ' '{sum[$2]+=$1;} END {for(c in sum){print c,sum[c];}}'
| sort -n -r -k 2 >> sum.log
解析:
1.grep -v '^$' 对log中的空行过滤
2.awk
-F列分隔符
'{sum[$2]+=$1;} END {for(c in sum){print c,sum[c];}}' 根据列进行操作
sum[$2]+=$1 根据第二列对第一列求和
END 求和完毕进行输出
for(c in sum){print c,sum[c];} 使用for循环输出
3.sort 进行排序
-n 根据数值大小排序
-r 从大到小排序,不写则默认从小到大
-k 根据第几列排序,2根据第二列
获取日志文件的信息
示例:
2018-09-12 15:20:55.615 [INFO] [com.xxx.service.impl.xxx][192] xxx: xxx:113740 | returnCode:0
2018-09-12 15:27:36.870 [INFO] [com.xxx.service.impl.xxx][192] xxx: xxx:113740 | returnCode:0
2018-09-12 15:27:40.688 [INFO] [com.xxx.service.impl.xxx][192] xxx: xxx:113740 | returnCode:0
2018-09-12 15:27:43.017 [INFO] [com.xxxservice.impl.xxx][192] xxx: xxx:113740 | returnCode:0
目标:
113740 4
shell脚本:
file_name="xxx*";
grep 'returnCode:0' ../$file_name
| awk -F ':' '{print $6}'
| awk -F ' | ' '{print $1}'
| uniq -c
>> count.log
解析:
1.file_name 文件名匹配
2.grep 'returnCode:0' ../$file_name
根据文件名匹配所有结果码为成功的行
3.awk -F ':' '{print $6}'
根据:分隔符获取第六列
4.awk -F ' | ' '{print $1}'
根据 | 分隔符获取第六列中的第一列
5. uniq -c
去重并累加
6. >> count.log
把结果写到log
网友评论