前言
在Linux中,awk是一个非常重要的、更是强大的文本处理工具
学会awk将会使你的工作变得更加的轻松,当然最重要的是…高大上啊,咳咳
好,废话不多说,进入正题了
正文
首先记住几个特殊变量
- NR:这个变量可以用来表示行号
- NF:这个变量可以用来表示列号
- $1 : 表示当前记录的第一列的文本内容
- $2 :表示当前记录的第二列的文本内容
然后再记住几个重要的参数
- sort :排序,但是是按照一个数值得第一个数字大小进行排序。比如:1,5,11,22的排序就是1, 11, 22, 5
- uniq -c:去重(统计):对重复出现的数值,每出现一次将其出现的次数+1
- sort -n :排序,是按照数值的大小进行排序1, 5, 11, 22 的排序就是1, 5, 11, 22
awk实用理解案例
1、指定awk的字段分隔符【默认是以空格为分隔符】
$ awk -F: '{ print $1 }' /etc/passwd
$ awk 'BEGIN{ FS=":" }{ print $1 }' /etc/passwd
# 这里有两种方法,一种是直接 -F: 指定分隔符为: 一种是通过BEGIN{ FS=":" }
2、指定打印文件中的第2列和第3列
$ awk -F: '{ print $2, $3 }' /etc/passwd
x 0
x 1
x 2
x 3
3、统计文件/etc/passwd的行数,打印出所有的行号
$ awk '{ print NR }' /etc/passwd
...
...
39
40
41
4、打印第1行的第7列
$ awk -F: 'NR==1{ print $7 }' /etc/passwd
/bin/bash
# NR代表行号,NR==1就表示是第一行
5、打印最后一列和倒数第四列
awk -F: '{ print $(NF), $(NF-3) }' /etc/passwd
/sbin/nologin 72
/sbin/nologin 25
/sbin/nologin 38
# 直接写$(NF) 指的就是最后一列
# 如果是$(NF-3) 减去3,就是倒数第四列
5、在命令行中,传递变量到awk中
$ var=5000
$ echo | awk -v variable=$var '{ print variable }'
5000
# awk起到的是一个中间变量的作用
# 在awk中需要再次声明一个中间变量,这里是variable
# 把在在awk中声明的中间变量bariable传递给print
6、在脚本中,传递多个变量到awk中
$ var1="Variable01" ; var2="Variable02"
$ echo | awk '{ print v1, v2 }' v1=$var1 v2=$var2
7、换行
# print: 在每次输出的后面加一个\n来换行,而printf不会。
# 所以printf的所有输出都挤在一行中
#而print每次输出后都会自动换行
$ awk 'BEGIN{ FS=":" }{ printf $1 }' /etc/passwd
rootbindaemonadmlpsyncshutdown
$ awk 'BEGIN{ FS=":" }{ print $1 }' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
8、排序(从日志文件access.log中统计出访问的IP,并且进行排序 输出到文件text.txt)
$ awk 'BEGIN{ FS=" " }{ print $1 }' access.log | sort >> text.txt
# sort 就是对awk切出来的第一列的文本按照第一个数字的大小进行排序
9、去重统计(针对第步8的输出进行统计每一个IP访问了多少次)
$ awk 'BEGIN{ FS=" " }{ print $1 }' access.log | sort | uniq -c >> text.txt
170 112.66.41.143
329 223.198.168.116
243 112.66.32.178
555 54.227.74.125
215 121.58.53.171
# uniq -c 就是进行统计每一个IP出现了多少次
10、如果我们希望对统计的结果进行排序,按照访问次数从多到少降序排序
$ awk 'BEGIN{ FS=" " }{ print $1 }' access.log | sort | uniq -c | sort -nr >> text.txt
555 54.227.74.125
329 223.198.168.116
243 112.66.32.178
215 121.58.53.171
170 112.66.41.143
- $1:打印出第11列、排序、去重【统计】
-
- sort:排序,但是是依据首个字符的大小,所以要加上参数n和r
-n:number 按照数值的大小进行升序排序
-r: reverse反转【升序-->>降序 降序-->>升序】
补充:
- 第一次的sort绝对不能少,首先要排好序,然后再进行去重统计
- 否则很可能同一个ip在前面统计出三次,,后边又统计出5次
- 实际上就是因为少了第一次的sort
- 这个ip其实一共是出现了8次
优秀是一种选择,也是一种态度