正则表达式:awk

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式:awk相关的知识,希望对你有一定的参考价值。

一、awk 简介

简介:awk是一个强大的文本分析工具,相对于grep的过滤,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。相比于sed常常作用于一整行的           处理,awk则比较倾向于将一行分为数个“字段”来处理。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种           分析处理。
语法:awk + 参数 + 动作
参数:-F,指明以什么为字段分割符来分段

[[email protected] ~]# 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 的条件操作符

~  :匹配,与==相比不是精确比较,有包含就可以
!~  :不匹配,不精确比较,没有包含就可以
==  :等于,必须全部相等,精确比较
!=  :不等于,精确比较

[[email protected] ~]# awk -F ‘:‘ ‘{print $4,$5}‘ /etc/passwd  //当我们没有指定显示的分割符时,显示的结果中默认空白键为分割符
0 root
1 bin    
2 daemon
4 adm
....
[[email protected] ~]# awk -F ‘:‘ ‘OFS=":" {print $4,$5}‘ /etc/passwd  //我们可以通过OFS来指定结果中显示的分隔符
0:root    
1:bin   
2:daemon
4:adm
....
[[email protected] ~]# awk ‘/root/‘ /etc/passwd  //awk可以直接匹配带有某个关键字的行
root:x:0:0:root:/root:/bin/bash    
operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] ~]# 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
[[email protected] ~]# awk -F ‘:‘ ‘$1~/root/‘ /etc/passwd  //匹配第一个字段是root的行
root:x:0:0:root:/root:/bin/bash    
[[email protected] ~]# awk -F ‘:‘ ‘$1=="nobody"‘ /etc/passwd  //“==”为精确匹配,第一个字段必须是nobody才能匹配
nobody:x:99:99:Nobody:/:/sbin/nologin
[[email protected] ~]#    
[[email protected] ~]# 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
....
[[email protected] ~]# 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
....
[[email protected] ~]# awk -F ‘:‘ ‘NR==10‘ /etc/passwd  //NR表示行,这里匹配第10行
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[[email protected] ~]#    
[[email protected] ~]# 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. 用‘:’作为分隔符,打印第一段以及最后一段,并且中间用‘@’连接(例如,第一行应该是这样的形式‘[email protected]/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的主要内容,如果未能解决你的问题,请参考以下文章

awk从入门到入土正则匹配

python 正则表达式 re模块基础

linux 下的 正则表达式(awk,sed,awk)学习

Linux awk 正则表达式正则运算符详细介绍

awk中如何用正则表达式判断某位数值的位数?

正则表达式 三剑客--awk