1.12
linux 三剑客之 awk 用法详解
内容:
1. awk 执行过程
2. awk 命令格式
3. awk 用法
4. awk 数组
第 1 章 awk 执行过程
一直读取到文件的最后一行
第 2 章 awk
找谁 {干啥}
模式 {动作}
模式 pattern 动作 action
第 3 章
awk 中什么可以作为模式
正则表达式
比较表达式 NR>10
范围模式
特殊模式 BEGIN{} 和 END{}
awk 支持正则中的特殊符号
3.1 正则表达式
测试文件 / server/files/reg.txt
- [root@oldboy-gao files]# cat reg.txt
- Zhang Dandan 41117397 :250:100:175
- Zhang Xiaoyu 390320151 :155:90:201
- Meng Feixue 80042789 :250:60:50
- Wu Waiwai 70271111 :250:80:75
- Liu Bingbing 41117483 :250:100:175
- Wang Xiaoai 3515064655 :50:95:135
- Zi Gege 1986787350 :250:168:200
- Li Youjiu 918391635 :175:75:300
- Lao Nanhai 918391635 :250:100:175
练习: 找出第三列包含连续数字 0
- awk '$3 ~/0+/' reg.txt
- Zhang Xiaoyu 390320151 :155:90:201
- Meng Feixue 80042789 :250:60:50
- Wu Waiwai 70271111 :250:80:75
- Wang Xiaoai 3515064655 :50:95:135
~ 匹配 包含
!~ 不匹配 不包含
实例 3-1
显示 Xiaoyu 的姓氏和 ID 号
条件: 第二列中包含 Xiaoyu
动作: 显示哪一列
- [root@oldboy-gao files]# awk '$2~/Xiaoyu/{print $1,$3}' reg.txt
- Zhang 390320151
比较:/Xiaoyu / 与 $2~/Xiaoyu / 区别
- [root@oldboy-gao files]# awk '$2~/Xiaoyu/{print $1,$3}' reg.txt
- Zhang 390320151
/Xiaoyu / 与 $2~/Xiaoyu / 区别
/Xiaoyu / 表示这一行中有 Xiaoyu ===$0~/Xiaoyu/
$2~/Xiaoyu/ 表示第 2 列中有 Xiaoyu
实例 3-2 找出姓 Zhang 的人第二次捐款及其姓氏
- [root@oldboy-gao files]# awk -F '[ :]+' '$1 ~/Zhang/{print $1,$5}' reg.txt
- Zhang 100
- Zhang 90
逆向思维 -- 倒数第几行
- [root@oldboy-gao files]# awk -F '[ :]+' '$1 ~/Zhang/{print $1,$(NF-1)}' reg.txt
- Zhang 100
- Zhang 90
实例 3-3
显示所有以 41 开头的 ID 号码的人的全名和 ID 号码
- [root@oldboy-gao files]# awk '$3~/^41/{print $1,$2,$3}' reg.txt
- Zhang Dandan 41117397
- Liu Bingbing 41117483
实例 3-4
显示所有 ID 号码最后一位数字是 1 或 5 的人的全名
- [root@oldboy-gao files]# awk '$3~/[15]$/{print $1,$2}' reg.txt
- Zhang Xiaoyu
- Wu Waiwai
- Wang Xiaoai
- Li Youjiu
- Lao Nanhai
- 3.1.1
显示 Xiaoyu 的捐款, 每个值时都有以 $ 开头, 如 $520$200$135
awk 怎么替换 ---awk{gsub}
- [root@oldboy-gao files]# awk '$2 ~ /Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' reg.txt
- $155$90$201
gsub 函数 格式 / 用法
{grup(/ 你要找什么 /, 替换成什么, 在第几列)}
grup(/ 你要找什么 /, 替换成什么)=====grup(/ 你要找什么 /, 替换成什么,$0) 默认找整行
3.2
特殊模式 BEGIN{} 和 END{}
3.2.1 BEGIN{} 里面的内容会在 awk 读取文件之前执行
awk 里面的内置变量
[root@oldboy-gao ~]# awk 'BEGIN{print"this is beginning"}{print $0}' /server/files/reg.txt
this is beginning 在 awk 读取文件之前运行
- Zhang Dandan 41117397 :250:100:175
- Zhang Xiaoyu 390320151 :155:90:201
- Meng Feixue 80042789 :250:60:50
BEGIN{}: 常用来测试 计算 修改 awk 内置变量
3.2.2 END{} END{} 里面的内容会在 awk 读取完文件内容之后运行
先计算, END 输出最终结果
- [root@oldboy-gao ~]# awk '{print $0}END{print"end of file"}' /server/files/reg.txt
- Zhang Dandan 41117397 :250:100:175
- Zhang Xiaoyu 390320151 :155:90:201
end of file 在 awk 读取完文件内容之后运行
作用: 显示计算的最终结果
3.2.3 awk 内置变量
FS
-F == 修改 FS 内置变量 (filed separator)
-F: ==BEGIN{FS=:} ===-vFS=:
-v 指定变量 linux 与 awk 的桥梁
NR 行号
NR NF 别改变量
NF number of field 每一行有多少列
实例 3-1 统计 / etc/services 文件中空行数量
- [root@oldboy-gao files]# egrep '^
16 -c 统计行数
i=i+1 === i++ 统计次数 每次加一 计数
i=i+$0 ==i+=$0 计算总和 累加
- awk '/^$/{i++;print i}' /etc/services
- 1
2 awk 中使用变量 直接写 直接用 不需要 $
...
15
16
前面先计算 END 显示最终结果
- [root@oldboy-gao files]# awk '/^$/{i++}END{print i}' /etc/services
- 16
实例 3-2 统计 / etc/passwd 中有多少个虚拟用户
- [root@oldboy-gao files]# awk -F '[:]' '$NF~/nologin/{i++}END{print i}' /etc/passwd
- 20
实例 3-3 计算 seq 10 i=i+$0 计算总和 累加
- [root@oldboy-gao files]# seq 10|awk '{sum=sum+$0}END{print sum}'
- 55
第 4 章 awk 完整执行过程
以行为单位执行
第 5 章 awk 数组
5.1 awk 数组的组成
数组的名字 [元素]= 元素内容
统计谁 中括号里写谁
测试用 BENGIN{}
- [root@oldboy-gao ~]# awk 'BEGIN{h[110]="UFO";h[114]="haha";print h[110],h[114]}'
- UFO haha
实例 5-1 处理以下文件内容, 将域名取出并根据域名进行计数排序处理
- [root@oldboy - gao files]#cat / server / files / url.txt http: //www.etiantian.org/index.html
- http: //www.etiantian.org/1.html
- http: //post.etiantian.org/index.html
- http: //mp3.etiantian.org/index.html
- http: //www.etiantian.org/3.html
- http: //post.etiantian.org/2.html
数组应用
- [root@oldboyedu43-lnb files]# awk -F "[/.]+" '{h[$2]++}END{print h["www"],h["post"],h["mp3"]}' url.txt
- 3 2 1
简便
- [root@oldboyedu43-lnb files]# awk -F "[/.]+" '{h[$2]++}END{for( pol in h ) print pol}' url.txt
- www
- mp3
- post
- [root@oldboyedu43-lnb files]# awk -F "[/.]+" '{h[$2]++}END{for( pol in h ) print pol,h[pol]}' url.txt
- www 3 pol
(变量 - 包工头)- 代表三个变量
www mp3 post
mp3 1 h[pol] 变量的内容
post 2
单独取某一变量内容
[root@oldboy-gao files]# awk -F "[/.]+" '{h[$2]++}END{for(pol in h)print h["www"]}' url.txt
3 思想: awk 工作以行为单位
- 3
- 3
- [root@oldboy-gao files]# awk -F "[/.]+" '{h[$2]++}END{for(pol in h)print h["post"]}' url.txt
- 2
- 2
- 2
数组工作过程 / 原理
[root@oldboy-gao files]# awk -F "[/.]+" '{h[$2]++;print $2,h["www"]}' url.txt|column -t 元素 统计 www
www 1 符合 h[$2]=0+1=1
www 2 符合 h[$2]=1+1=2
post 2 不符合
mp3 2 不符合
www 3 符合 h[$2]=2+1=3
post 3 不符合
文件环境 / oldboy/awklx/secure
- [root@oldboy - gao files]#tail / oldboy / awklx / secure - 20161219 Dec 19 03 : 41 : 56 localhost sshd[9025] : Failed password
- for root from 59.63.166.84 port 58082 ssh2 Dec 19 03 : 41 : 57 localhost sshd[9025] : Failed password
- for root from 59.63.166.84 port 58082 ssh2 Dec 19 03 : 41 : 57 localhost sshd[9025] : Failed password
- for root from 59.63.166.84 port 58082 ssh2
实例 5-2 统计谁在破解你的密码 -- 重点
- [root@oldboy-gao files]# awk '/Failed/{h[$(NF-3)]++}END{for(gao in h)print gao,h[gao]}' /oldboy/awklx/secure-20161219|column -t|sort -rnk2
- 218.65.30.25 68652 h[$(NF-3)
] 酒店 -- 元素 [
倒数第四列]
218.65.30.53 34326 END{for(gao in h) 循环
218.87.109.154 21201 print gao,h[gao]} 显示变量内容, 显示房间内容
112.85.42.103 18065 column -t 每列对齐
112.85.42.99 17164 sort -rnk2 排序 倒序 把内容当做数字 指定按列
实例 5-3 统计哪个用户被破解的次数最多
- [root@oldboy-gao awklx]# awk '/Failed/{h[$(NF-5)]++}END{for(pol in h)print pol,h[pol]}' secure-20161219|grep 'root'
- root 364610
1.12-linux 三剑客之 awk 用法详解
- awk '/^$/{i++;print i}' /etc/services
- 1
- [root@oldboy-gao files]# awk '/^$/{i++}END{print i}' /etc/services
- 16
- [root@oldboy-gao files]# awk -F '[:]' '$NF~/nologin/{i++}END{print i}' /etc/passwd
- 20
- [root@oldboy-gao files]# seq 10|awk '{sum=sum+$0}END{print sum}'
- 55
- [root@oldboy-gao ~]# awk 'BEGIN{h[110]="UFO";h[114]="haha";print h[110],h[114]}'
- UFO haha
- [root@oldboy - gao files]#cat / server / files / url.txt http: //www.etiantian.org/index.html
- http: //www.etiantian.org/1.html
- http: //post.etiantian.org/index.html
- http: //mp3.etiantian.org/index.html
- http: //www.etiantian.org/3.html
- http: //post.etiantian.org/2.html
- [root@oldboyedu43-lnb files]# awk -F "[/.]+" '{h[$2]++}END{print h["www"],h["post"],h["mp3"]}' url.txt
- 3 2 1
- [root@oldboyedu43-lnb files]# awk -F "[/.]+" '{h[$2]++}END{for( pol in h ) print pol}' url.txt
- www
- mp3
- post
- [root@oldboyedu43-lnb files]# awk -F "[/.]+" '{h[$2]++}END{for( pol in h ) print pol,h[pol]}' url.txt
- www 3 pol
- 3
- 3
- [root@oldboy-gao files]# awk -F "[/.]+" '{h[$2]++}END{for(pol in h)print h["post"]}' url.txt
- 2
- 2
- 2
- [root@oldboy - gao files]#tail / oldboy / awklx / secure - 20161219 Dec 19 03 : 41 : 56 localhost sshd[9025] : Failed password
- for root from 59.63.166.84 port 58082 ssh2 Dec 19 03 : 41 : 57 localhost sshd[9025] : Failed password
- for root from 59.63.166.84 port 58082 ssh2 Dec 19 03 : 41 : 57 localhost sshd[9025] : Failed password
- for root from 59.63.166.84 port 58082 ssh2
- [root@oldboy-gao files]# awk '/Failed/{h[$(NF-3)]++}END{for(gao in h)print gao,h[gao]}' /oldboy/awklx/secure-20161219|column -t|sort -rnk2
- 218.65.30.25 68652 h[$(NF-3)
- [root@oldboy-gao awklx]# awk '/Failed/{h[$(NF-5)]++}END{for(pol in h)print pol,h[pol]}' secure-20161219|grep 'root'
- root 364610
来源: http://www.bubuko.com/infodetail-2492073.html