背景

偶然看到一篇性能优化博客,里面记录了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

Linux中sort和uniq关于排序去重的那些用法

* 统计耗时分布,需要先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

sort与uniq命令的使用

测试文本
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的应用场景