首页 > 代码库 > 正则表达式:awk
正则表达式:awk
一、awk 简介
简介:awk是一个强大的文本分析工具,相对于grep的过滤,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。相比于sed常常作用于一整行的 处理,awk则比较倾向于将一行分为数个“字段”来处理。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种 分析处理。
语法:awk + 参数 + 动作
参数:-F,指明以什么为字段分割符来分段
[root@root ~]# awk -F ‘:‘ ‘{print $5}‘ /etc/passwd //以冒号为分割符,把/etc/passwd的第5段打印出来
root
bin
daemon
adm
....
二、awk 的变量
OFS 显示指定的分割符(默认字段的分割符是"空白键" 或 "[tab]键")
NR 表示行数,比如NR==2表示匹配第2行,NR==10表示匹配第10行。特殊:$NR表示第N行的第N段,如第1行的第1段,第2行的第2段,......
NF 当前记录中的字段个数,即有多少列,比如NF==7表示匹配有7列(即7个字段)的行,NF==10表示匹配有10列的行。特殊:$NF表示每行最后一段
$0 表示所有字段
$1 表示第一个字段
$2 表示第二个字段
$n 表示第n个字段
三、awk 的条件操作符
~ :匹配,与==相比不是精确比较,有包含就可以
!~ :不匹配,不精确比较,没有包含就可以
== :等于,必须全部相等,精确比较
!= :不等于,精确比较
[root@root ~]# awk -F ‘:‘ ‘{print $4,$5}‘ /etc/passwd //当我们没有指定显示的分割符时,显示的结果中默认空白键为分割符
0 root
1 bin
2 daemon
4 adm
....
[root@root ~]# awk -F ‘:‘ ‘OFS=":" {print $4,$5}‘ /etc/passwd //我们可以通过OFS来指定结果中显示的分隔符
0:root
1:bin
2:daemon
4:adm
....
[root@root ~]# awk ‘/root/‘ /etc/passwd //awk可以直接匹配带有某个关键字的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@root ~]# awk ‘/user|root/‘ /etc/passwd //awk可以直接使用“|”、“?”、“+”这些元字符扩展集,而grep需要加上-E选项,sed需要加上-r选项才能使用
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
[root@root ~]# awk -F ‘:‘ ‘$1~/root/‘ /etc/passwd //匹配第一个字段是root的行
root:x:0:0:root:/root:/bin/bash
[root@root ~]# awk -F ‘:‘ ‘$1=="nobody"‘ /etc/passwd //“==”为精确匹配,第一个字段必须是nobody才能匹配
nobody:x:99:99:Nobody:/:/sbin/nologin
[root@root ~]#
[root@root ~]# awk -F ‘:‘ ‘$3>=5‘ /etc/passwd //匹配第三段大于等于5的行
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
....
[root@root ~]# awk -F ‘:‘ ‘$3>="5"‘ /etc/passwd //加上引号会把它当成ASCII码
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
....
[root@root ~]# awk -F ‘:‘ ‘NR==10‘ /etc/passwd //NR表示行,这里匹配第10行
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@root ~]#
[root@root ~]# awk -F ‘:‘ ‘{print NF}‘ /etc/passwd //“NF”表示有多少字段(即有多少列),这里表示每一行有7段(即7列)
7
7
7
7
....
扩展:awk 练习题
1. 用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt)
2. 查找所有包含‘bash’的行
3. 用‘:’作为分隔符,查找第三段等于0的行
4. 用‘:’作为分隔符,查找第一段为‘root’的行,并把该段的‘root’换成‘toor’ (可以连同sed一起使用)
5. 用‘:’作为分隔符,打印最后一段
6. 打印行数大于20的所有行
7. 用‘:’作为分隔符,打印所有第三段小于第四段的行
8. 用‘:’作为分隔符,打印第一段以及最后一段,并且中间用‘@’连接(例如,第一行应该是这样的形式‘root@/bin/bash‘)
9. 用‘:’作为分隔符,把整个文档的第四段相加,求和
awk习题答案:
1. awk ‘{print $0}‘ test.txt
2. awk ‘/bash/‘ test.txt
3. awk -F‘:‘ ‘$3=="0"‘ test.txt
4. awk -F‘:‘ ‘$1=="root"‘ test.txt |sed ‘s/root/toor/‘
5. awk -F‘:‘ ‘{print $NF}‘ test.txt
6. awk -F‘:‘ ‘NR>20‘ test.txt
7. awk -F‘:‘ ‘$3<$4‘ test.txt
8. awk -F‘:‘ ‘{print $1"@"$NF}‘ test.txt
9. awk -F‘:‘ ‘{(sum+=$4)}; END {print sum}‘ test.txt
正则表达式:awk