正则表达式(三剑客之awk)
1.awk工具的使用
1.1 截取文档中的某个段
1)打印以 : 为分隔的第一个字段
[root@localhost ~]# head -n3 /etc/passwd | awk -F ':' '{print $1}'
2)注意事项
-F:作用是指定分隔符。如果不加分隔符,则以空格或者tab为分隔符
print:为打印的动作,用来打印某个字段
$1:为第一个字段,以此类推
$0:比较特殊,表示整行
注意awk的格式,-F后面紧跟单引号,单引号里面为分隔符。
print的动作要用{}括起来,否则会报错。
3)print还可以打印自定义的内容,但是自定义的内容要用双引号括起来
head -n3 /etc/passwd | awk -F ':' '{print $1"#"$2"#"$3"#"$4"#"}'
1.2 匹配字符或者字符串
1)跟sed用法类似,能实现grep的功能,但没有颜色显示
[root@localhost ~]# awk '/oo/' /etc/passwd
2)可以让某个段匹配,这里的~就匹配的意思
[root@localhost ~]# awk -F ':' '$1 ~/oo/' /etc/passwd
3)awk还可以多次匹配
awk -F ':' '/root/{print $1,$3} /sbin/ {print $1,$3}' /etc/passwd
1.3 条件操作符
1)awk可以用逻辑符号进行判断,比如==就是等于,也可以理解为精准匹配
[root@localhost ~]# awk -F ':' '$3=="0"' /etc/passwd
注意:在和数字比较时,若把比较的数字用双引号引起来,那么awk不会认为是数字,而会认为是字符,不加双引号则会认为是数字
2)把大于等于500的行打印出来
[root@localhost ~]# awk -F ':' '$3>=500' /etc/passwd
加引号的结果并不理想,这是因为awk把所有的数字当做字符了
[root@localhost ~]# awk -F ':' '$3>="500"' /etc/passwd
3)!=表示不匹配
针对某一个字段的字符进行逻辑比较
[root@localhost ~]# awk -F ':' '$7!="/sbin/nologin"' /etc/passwd
在两个段之间进行逻辑比较
[root@localhost ~]# awk -F ':' '$3<$4' /etc/passwd
4)还可以使用&&和||,它们分别表示“并且”和“或者”
&&的用法
[root@localhost ~]# awk -F ':' '$3<"7" && $3>"5"' /etc/passwd
||的用法
awk -F ':' '$3<"7" || $7=="/bin/bash"' /etc/passwd
1.4 awk的内置变量
1)awk常用的变量
OFS:OFS和-F选项有类似的功能,也可以用来定义分隔符,但是它是在输出的时候定义
NF:表示用分隔符分隔后一共有多少段
NR:表示行号
2)OFS的用法
[root@localhost ~]# head -5 /etc/passwd | awk -F ':' '{OFS="#"}{print $1,$2,$3}'
还有更高级的一些用法
awk -F ':' '{OFS="#"} {if($3>5) {print $1,$2,$3}}' /etc/passwd
3)变量NF的具体用法
[root@localhost ~]# head -n3 /etc/passwd | awk -F ':' '{print NF}'
$NF:表示最后一段的值
[root@localhost ~]# head -n3 /etc/passwd | awk -F ':' '{print $NF}'
4)变量NR的具体用法
[root@localhost ~]# head -n3 /etc/passwd | awk -F ':' '{print NR}'
还可以使用NR作为判断条件
[root@localhost ~]# awk 'NR>8' /etc/passwd
NR也可以配合段匹配一起使用
[root@localhost ~]# awk -F ':' 'NR<20 && $1 ~ /roo/' /etc/passwd
1.5 awk中的数学运算
1)awk可以更改段值
[root@localhost ~]# head -n3 /etc/passwd | awk -F ':' '$1="root"'
2)awk也可以对各个段的值进行数学运算
第七个字段等于第三个字段加上第四个字段整行的打印出来
head -n2 /etc/passwd | awk -F ':' '{$7=$3+$4;print $0}'
3)awk还可以计算某个段的总和
这里的END是awk特有的语法,表示所有的行都已执行
awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd