复习一下Linux命令awk的使用

351 阅读1分钟

很久不用linux命令,好多都忘记了,只是常用的记得比较好比如tail、 grep、 top、 touch、 ps-ef、sed等,用的少的日久失修,人脑不像计算机,计算机磁盘满了手动清除才能存下新的文件。但是人脑毕竟不是计算机,遗忘是自然界赋予人的脑的自动清除算法。。。 下面回忆一下awk的统计日志用法:

1.下面我有一个rockmq的日志

hxr-mac:rocketmqlogs houxiurong$ cat namesrv_default.log
2019-09-27 17:51:49 INFO main - instrumented a special java.util.Set into: sun.nio.ch.KQueueSelectorImpl@1990a65e
2019-09-27 17:51:49 INFO main - instrumented a special java.util.Set into: sun.nio.ch.KQueueSelectorImpl@150c158
2019-09-27 17:51:49 INFO main - instrumented a special java.util.Set into: sun.nio.ch.KQueueSelectorImpl@4524411f
2019-09-27 17:51:49 INFO main - instrumented a special java.util.Set into: sun.nio.ch.KQueueSelectorImpl@401e7803
2019-09-27 17:53:02 INFO main - instrumented a special java.util.Set into: sun.nio.ch.KQueueSelectorImpl@1990a65e
2019-09-27 17:53:02 INFO main - instrumented a special java.util.Set into: sun.nio.ch.KQueueSelectorImpl@150c158
2019-09-27 17:53:02 INFO main - instrumented a special java.util.Set into: sun.nio.ch.KQueueSelectorImpl@4524411f
2019-09-27 17:53:02 INFO main - instrumented a special java.util.Set into: sun.nio.ch.KQueueSelectorImpl@401e7803

统计@后面字符串出现的数量:
比如:

2 | 401e7803
2 | 4524411f

下面是执行命令:

hxr-mac:rocketmqlogs houxiurong$ cat namesrv_default.log | awk -F '(into:|@)' '{print $3}'| sort | uniq -c
   2 150c158
   2 1990a65e
   2 401e7803
   2 4524411f
hxr-mac:rocketmqlogs houxiurong$   

总结

命令说明:
1.从每一行取出需要的字符串并分割 awk -F '(into:|@)' '{print $1}' 按照into: 和 @符号分割,输出结果

hxr-mac:rocketmqlogs houxiurong$ cat namesrv_default.log |awk -F '(into:|@)' '{print $1}'
2019-09-27 17:51:49 INFO main - instrumented a special java.util.Set
2019-09-27 17:51:49 INFO main - instrumented a special java.util.Set
2019-09-27 17:51:49 INFO main - instrumented a special java.util.Set
2019-09-27 17:51:49 INFO main - instrumented a special java.util.Set
2019-09-27 17:53:02 INFO main - instrumented a special java.util.Set
2019-09-27 17:53:02 INFO main - instrumented a special java.util.Set
2019-09-27 17:53:02 INFO main - instrumented a special java.util.Set
2019-09-27 17:53:02 INFO main - instrumented a special java.util.Set
hxr-mac:rocketmqlogs houxiurong$

2.分割后第二个字段值

hxr-mac:rocketmqlogs houxiurong$ cat namesrv_default.log |awk -F '(into:|@)' '{print $2}'
 sun.nio.ch.KQueueSelectorImpl
 sun.nio.ch.KQueueSelectorImpl
 sun.nio.ch.KQueueSelectorImpl
 sun.nio.ch.KQueueSelectorImpl
 sun.nio.ch.KQueueSelectorImpl
 sun.nio.ch.KQueueSelectorImpl
 sun.nio.ch.KQueueSelectorImpl
 sun.nio.ch.KQueueSelectorImpl
hxr-mac:rocketmqlogs houxiurong$

3.分割后第三个字段值,这个字段才是需要的字段

hxr-mac:rocketmqlogs houxiurong$ cat namesrv_default.log |awk -F '(into:|@)' '{print $3}'
1990a65e
150c158
4524411f
401e7803
1990a65e
150c158
4524411f
401e7803
hxr-mac:rocketmqlogs houxiurong$

4.第三个字段但是里面有重复的值,要怎么处理了?使用管道| sort排序

hxr-mac:rocketmqlogs houxiurong$ cat namesrv_default.log |awk -F '(into:|@)' '{print $3}' | sort
150c158
150c158
1990a65e
1990a65e
401e7803
401e7803
4524411f
4524411f
hxr-mac:rocketmqlogs houxiurong$

通过==分割三个字段的值并展示:

hxr-mac:rocketmqlogs houxiurong$ cat namesrv_default.log |awk -F '(into:|@)' '{print "=="$1,"=="$2,"=="$3}' | sort |uniq -c
   1 ==2019-09-27 17:51:49 INFO main - instrumented a special java.util.Set  == sun.nio.ch.KQueueSelectorImpl ==150c158
   1 ==2019-09-27 17:51:49 INFO main - instrumented a special java.util.Set  == sun.nio.ch.KQueueSelectorImpl ==1990a65e
   1 ==2019-09-27 17:51:49 INFO main - instrumented a special java.util.Set  == sun.nio.ch.KQueueSelectorImpl ==401e7803
   1 ==2019-09-27 17:51:49 INFO main - instrumented a special java.util.Set  == sun.nio.ch.KQueueSelectorImpl ==4524411f
   1 ==2019-09-27 17:53:02 INFO main - instrumented a special java.util.Set  == sun.nio.ch.KQueueSelectorImpl ==150c158
   1 ==2019-09-27 17:53:02 INFO main - instrumented a special java.util.Set  == sun.nio.ch.KQueueSelectorImpl ==1990a65e
   1 ==2019-09-27 17:53:02 INFO main - instrumented a special java.util.Set  == sun.nio.ch.KQueueSelectorImpl ==401e7803
   1 ==2019-09-27 17:53:02 INFO main - instrumented a special java.util.Set  == sun.nio.ch.KQueueSelectorImpl ==4524411f

sort 的 -n:依照数值的大小排序;-r 按照相反顺序排列

排序后还不是我需要的值,需要统计这个值出现的次数,可以使用
uniq常用命令字段:
-c 在输出行前面加上每行在输入文件中出现的次数。 -d 仅显示重复行。 -u 仅显示不重复的行。

5.将结果输出到文件中

hxr-mac:rocketmqlogs houxiurong$ cat namesrv_default.log |awk -F '(into:|@)' '{print $3}' | sort |uniq -c | sort -nr > testfile
hxr-mac:rocketmqlogs houxiurong$ ls
namesrv_default.log	testfile
hxr-mac:rocketmqlogs houxiurong$ cat testfile
   2 4524411f
   2 401e7803
   2 1990a65e
   2 150c158

复习awk命令结束。。。