苏黎 搜索开发工程师

AWK工具使用

2019-01-28
suli

awk工具

awk工具在linux系统下处理字符串太有用了,超级有用,掌握awk的几个功能提高工作效率简直太有好了。今天介绍使用几个常用awk使用技巧。

文本文件log.txt:

100501 appops    20   0 97.170g 0.095t 0.093t S   4.3 25.6 285:49.17 memcheck-amd64-
165113 appops    20   0  0.100t 0.090t 0.090t S   3.3 24.4 361:21.39 s-db-ctl
 94144 nobody    20   0   71856  36660   1600 S   2.2  0.0   0:00.04 nsar
 94145 appops    20   0   26660   3348   2492 R   1.1  0.0   0:00.02 top
     1 root      20   0   28940   4248   2648 S   0.0  0.0   4:55.21 systemd
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.83 kthreadd
     3 root      20   0       0      0      0 S   0.0  0.0   1:04.22 ksoftirqd/0
     5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
     8 root      20   0       0      0      0 S   0.0  0.0   9:22.52 rcu_sched
     9 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh

1.awk基本使用

分割多列默认是空格分隔符

awk '{print $1, $4}' log.txt

awk $1..$n表示第几例。注:$0表示整个行。

结果:

100501 0
165113 0
94144 0
94145 0
1 0
2 0
3 0
5 -20
8 0
9 0

2.格式化输出

awk支持像c语言一样的printf输出格式

awk '{printf "%-8s %-8s %-8s %-18s %-22s %-15s\n",$1,$2,$3,$4,$5,$6}' log.txt

结果:

100501   appops   20       0                  97.170g                0.095t
165113   appops   20       0                  0.100t                 0.090t
94144    nobody   20       0                  71856                  36660
94145    appops   20       0                  26660                  3348
1        root     20       0                  28940                  4248
2        root     20       0                  0                      0
3        root     20       0                  0                      0
5        root     0        -20                0                      0
8        root     20       0                  0                      0
9        root     20       0                  0                      0

3. 支持逻辑匹配

支持对多列数值进行匹配

awk '$1==100501 && $4==0' log.txt

结果:

100501 appops    20   0 97.170g 0.095t 0.093t S   4.3 25.6 285:49.17 memcheck-amd64-

其中的“==”为比较运算符。其他比较运算符:!=, >, <, >=, <=。

4. 指定分隔符

可以直接指定分隔符来分割

awk  -F: '{print $1,$2}' log.txt

结果:

100501 appops    20   0 97.170g 0.095t 0.093t S   4.3 25.6 285 49.17 memcheck-amd64-
165113 appops    20   0  0.100t 0.090t 0.090t S   3.3 24.4 361 21.39 s-db-ctl
 94144 nobody    20   0   71856  36660   1600 S   2.2  0.0   0 00.04 nsar
 94145 appops    20   0   26660   3348   2492 R   1.1  0.0   0 00.02 top
     1 root      20   0   28940   4248   2648 S   0.0  0.0   4 55.21 systemd
     2 root      20   0       0      0      0 S   0.0  0.0   0 00.83 kthreadd
     3 root      20   0       0      0      0 S   0.0  0.0   1 04.22 ksoftirqd/0
     5 root       0 -20       0      0      0 S   0.0  0.0   0 00.00 kworker/0
     8 root      20   0       0      0      0 S   0.0  0.0   9 22.52 rcu_sched
     9 root      20   0       0      0      0 S   0.0  0.0   0 00.00 rcu_bh

从:开始分割为两部分。多个字符串分割如下:

awk -F '[;:]' 多分隔符

5. 内建变量

awk有很多内建变量

符号 详细含义
$0 当前记录(这个变量中存放着整个行的内容
$1~$n 当前记录的第n个字段,字段间由FS分隔
FS 输入字段分隔符 默认是空格或Tab
NF 当前记录中的字段个数,就是有多少列
NR 当前记录中的字段个数,就是有多少列
FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
RS 输入的记录分隔符, 默认为换行符
OFS 输出字段分隔符, 默认也是空格
ORS 输出的记录分隔符,默认为换行符
FILENAME 当前输入文件的名字

6. 字符串匹配

awk有字符串匹配功能

awk  '$12 ~ /memcheck/' log.txt

结果:

100501 appops    20   0 97.170g 0.095t 0.093t S   4.3 25.6 285:49.17 memcheck-amd64-

7. 统计功能

统计目录下所有头文件大小

ls -l *.h | awk '{sum+=$8} END {print sum}'

统计所有网络连接的LISTEN,TIME_WAIT,ESTABLISHED个数

netstat -nat | awk 'NR!=1{a[$6]++;} END {for (i in a) print i ", " a[i];}'

统计所有进程的内存占用总数:

ps aux | awk 'NR!=1{a[$1]+=$6;} END { for(i in a) print i ", " a[i]"KB";}'

8. 几个常用使用技巧

awk 'length>80' file //打印每行大于80字节的行

netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr //按连接数打印客户端ip

参考

AWK教程

正则表达式


Similar Posts

上一篇 MurmurHash算法

下一篇 整型变长字段

Comments