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