相关正则文章 正则表达式
1. grep "request:(recharge" datafile.log* | grep -v "code=200" >> recharege.log
排除code为200的
1.1 *代表通配符
1.2 -v 代表非含义
2. 然后用awk 进行group by操作。
note: awk能够自动生成变量。 通过数组名+小标共同唯一确认。
例子:
我有一文本文件,例如 姓名 类型 金额 张三 1 27.43 李四 2 33.44 张三 2 55.55 丁六 1 66.66 赵七 1 77.77 我想 根据第二列——类型分别算出这个文件中所有第二列不同的(比如这里是1和2)总的金额是多少,总的行数是多少 如果是数据库,即我要的是 select sum(金额),count(*) from 表名 group by 类型; |
awk -F'<out_trade_no>|</out_trade_no>' '{types[$2]+=$3;count[$2]++}END{for(i intypes) printf"类型%s 共%d行 合计 %f\n",i,count[i],types[i]}' datafile
1.1 更复杂的控制,-F可以用或,这样更方便的截取字符串中的某个值。其他方案可以用正则中的分组使用。高级语言(java)中的多次切割.
1.2 printf 有占位符,但换行要加上\n
1.3 特殊字符用 ///转义.
1.4 awk 中的变量,和获取group by (时间函数)
less xxx.log.2017-07-13 | awk -F ',' '{subfix=substr($1,12,5) ;iindex=$2"_"subfix; count[iindex]++} END {print "totalTopiCount=" length(count); for (i in count ) printf "topic,%s , count,%s\n" ,i ,count[i] }' > roecketmq.txt
note: 1. 变量取值不需要加上 $, 否则默认就是匹配的整行$0.
2. subfix变量要通过""隔开,才能读取到值.否则为被判断为普通字符串.
特俗字符包括 双引号, 单引号 , 中括号,大括号 []
| awk -F '\\\[\\\"|\\\"\\\]' '{print $2}'
以[" 和 "]分割.
统计,平均耗时(去掉首尾3个突刺.):
less ~/phoenix_call.tt | grep WEB_PUBLIC_V3 | grep 支付宝 | awk -F ',' '{print $3}' | sort | awk '{ items[count++]=$1} END { num=0;len=0;for ( i in items ) { if ( i >3 || i < (length(count) -3) ) { print i,items[i];num=num+ items[i];len++ } }; print num/len} '
几点提示: 1.分割. 直接用-F. 不需要在 内部再分割. 和python思路不同. 例如先,分割,然后=分割.
2. 数组相比shell要强大,有默认值. python map默认值用 failRateMap=defaultdict(float) 或者str . 需要from collections import defaultdict 但是线上机器一般不支持.
shell也可以实现数组和循环.
group_name_array=(${group_name_str//,/ })
比一般的变量多了 {} . (())内部可以用于计算.
echo "应用分组列表:"
for (( j = 0; j < ${#group_name_array[@]}; j++ )); do
echo $((j+1))". "${group_name_array[j]}
done
sort -g
shell 语法和java类似. 多了个 ; do,空格. python 无空格
[1] 利用awk统计Linux下最常用的20条命令的shell http://www.ha97.com/3980.html