背景
偶然看到一篇性能优化博客,里面记录了awk统计了小时内每分钟的平均调用时长。
cat 性能日志 | grep '时间点 | awk -F ' ' '{print $2, $5}' |.......| awk -F ' ' '{sum[$1]+=$3;count[$1]+=1}END{for(i in sum) {print i,sum[i]/count[i]}}'
awk 打印出最后一行的第1列或者第2列?
打印最后一行的第二列就这样: awk ‘END{print $2}’ yourfile 打印指定行的指定列(例如第4行第2列): awk ‘NR==4{print $2}’ yourfile
从后往前
有时awk的print$是按照空格区分的,如果日志里有有个字段内容包含空格,则分割会错误。 有时发现可以从后往前分割就可以了。 // 附录6
grep|sed|awk 正则截取字符串
// 附录7,8
grep:
echo ...|grep -oP 'word.*abcd'
sed:
echo ... |sed -r 's/.*(word.*abcd).*/\1/g'
awk:
echo ... |awk '{print gensub(".*(word.*abcd).*","\\1","g")}'
实例
参数oP一起使用,会单独打印出要匹配的数字
[root@ss-server ~]# echo office365 | grep -oP "\d+"
365
[root@ss-server ~]# echo office365 | grep -oP "\d*"
365
[root@ss-server ~]# echo office365 | grep -oP "[0-9]*"
365
[root@ss-server ~]# echo 365beijing23 | grep -oP "\d+"
365
23
[root@ss-server ~]# echo 365beijing23 | grep -oP "\d*"
365
23
[root@ss-server ~]# echo 365beijing23 | grep -oP "[0-9]*"
365
23
实例:
371 cat gin-http.log.2022-02-10 |grep 'eqq-notify'|grep -w 'old_user_tag=gdt-yfioslk'|grep -w 'app_type=ios'|grep -oP 'muid.*?&'> old_user_idfa.txt
匹配什么开头的字符串
echo "abcabc12312" |grep -oP "(?<=(abc)).*"
awk + uniq
awk -F ' ' '{print $2, $5}' | uniq -c
awk -F ',' '{print $1}' | uniq -c
TODO
# awk for循环统计 行数n,累加t+,平均值t/n => 行数,耗时毫秒,平均耗时数
grep part3 main.log | grep '耗时' | awk -F ',' '{print $5}' | awk -F'"' '{print $4}' | awk -F"." '{n+=1; t+=$1} END{print n, t, t/n}'
awk + uniq
awk -F ' ' '{print $2, $5}' | uniq -c
awk -F ',' '{print $1}' | uniq -c
* linux之awk命令获取最后一列
awk -F',' '{print $NF}'
uniq + sort
* 统计耗时分布,需要先sort再去重
cat gin-http.log |grep -v '限流'|grep '2022-07-01 15:32:'|awk -F '"time":"' '{print $2}'|awk -F 'ms' '{print $1}'|awk -F '.' '{print $1}'|sort|uniq -c
1 29
9 30
9 31
17 32
12 33
21 34
24 35
25 36
38 37
57 38
64 39
测试文本
aaa
bbb
aaa
ccc
aaa
eee
ddd
$ uniq -c data.txt
1 aaa
1 bbb
1 aaa
1 ccc
1 aaa
1 eee
1 ddd
# 每一行前都标注了出现一次,但是并没有进行统计
$ sort data.txt | uniq -c
3 aaa
1 bbb
1 ccc
1 ddd
1 eee
# 排序并进行了出现次数统计
sort -n -k 1
按照指定列排序
[aplum@recommend-content-serving01 logs]$ cat gin-http.log|grep recommend_content |awk -F 'uid' '{print $2}'|awk -F ',' '{print $1,$2}'|awk -F ':' '{print $2}'|awk -F ' ' '{print $1}'|sort|uniq -c|sort -n -k 1
awk数组简单入门
$ cat file | awk '{a[$1]++}END{for (i in a){print i, a[i]}}'
awk的求和
awk '{sum += $1};END {print sum}'
$NF 可用来表示一个记录的最后一个栏位
NF表示当前行的字段数,$0表示当前行
awk 求和与合并
求和题
文本文件test1.txt
a 12
b 25
c 23
awk 'BEGIN{sum=0}{sum+=$2}END{print sum;}' test1.txt
实际使用
累计行数,同时打印某列的和。
awk -F "," '{n+=1; t+=$4} END{print n,t}'
合并题
文本test2.txt,每2行合并成一行
a 12
b 25
c 23
d 31
awk '{if( NR%2 != 0) ORS=" ";else ORS="\n"; print }' test2.txt
思路
1、如果行数等于基数,则输出分隔符为空白,
2、如果行数等于偶数,则输出分隔符为换行符,
3、打印全部
参考
1.解Bug之路-记一次线上请求偶尔变慢的排查–awk统计了下 B系统这个小时内每分钟的平均调用时长 2.使用awk命令获取文本的某一行,某一列 3.linux之awk命令获取最后一列 4.linux-awk中NF与$NF的区别 5.awk 打印出最后一行的第1列或者第2列? 6.AWK 技巧(取倒列,过滤行,匹配,不匹配,内置变量等) 7.grep|sed|awk 正则截取字符串 8.grep 正则截取字符串实例
原创文章转载请注明出处: awk的应用场景