正则之awk

来源:互联网 发布:阿里云华南1是哪里 编辑:程序博客网 时间:2024/06/11 21:39

六周第三次课(11月22日)
9.6/9.7 awk
~ 为匹配
-F定义分隔符
OFS为内置变量,替换print之后的分隔符
NR表示行号
NF表示段数

awk支持分段,可以不用脱意用括号之类的
awk -F ‘:’ ‘{print $1}’ /root/passwd #按:分割,并打印出第一段,打印所有段为$0
awk -F ‘:’ ‘{print $1,$3}’ /root/passwd #打印第一段和第三段
awk -F ‘:’ ‘{print $1”##”$3”##”$5}’ /test.txt #空格分割符时用##替换
awk ‘/oo/’ /root/passwd #列出含有oo的行

正则匹配
awk -F ‘:’ ‘$1 ~ /oo/’ /root/passwd #第一段含有oo的行

[root@wwlinux701 ~]# awk -F ':' '$1~ /oo/' /root/passwdroot:x:0:0:root:/root:/bin/bashroooot:#45345toooos:2423werweoowerweroowerweroooo234oo[root@wwlinux701 ~]# 

awk -F ‘:’ ‘$1 ~ /oo+/’ /root/passwd #可以用正则,不用脱意
awk -F ‘:’ ‘$1 ~ /o?o/’ /root/passwd #可以用正则,不用脱意

多条件匹配
awk -F ‘:’ ‘/root/ {print $1,$3} /user/ {print $1,$4}’ /root/passwd #多条件匹配,匹配含有root的打印1,3行和user打印1,4行

[root@wwlinux701 ~]# awk -F ':' '/root/ {print $1,$3} /user/ {print $1,$4}' /root/passwdroot 0operator 11tss 59user2 1087[root@wwlinux701 ~]# 

grep -E ‘root|user’ /root/passwd #查找含有root或者user的行
awk -F ‘:’ ‘/root|user/ {print $0}’ /root/passwd #查找含有root或者user的行,同上行
这里写图片描述

算数运算
awk -F ‘:’ ‘$3 == “0”’ /root/passwd #第三段等于0
awk -F ‘:’ ‘$3 == 0 {print $1}’ /root/passwd #第三段等于0

[root@wwlinux701 ~]# awk -F ':' '$3 == "0"' /root/passwdroot:x:0:0:root:/root:/bin/bash[root@wwlinux701 ~]# 

awk -F ‘:’ ‘$3 >= “500”’ /root/passwd #双引号是以ASIS码
awk -F ‘:’ ‘$3 >= 500’ /root/passwd #第三段大于等于500
这里写图片描述
awk -F ‘:’ ‘$7!=”/sbin/nologin” {print $0}’ /root/passwd #第7段不等于/sbin/nologin 这个是字符串必须加双引号

逻辑运算
awk -F ‘:’ ‘$3<$4’ /root/passwd #第三段小于第四段
awk -F ‘:’ ‘$3==$4’ /root/passwd #第三段等于第四段
awk -F ‘:’ ‘$3>”5” && $3<”7” ’ /root/passwd #第三段大于5 并且小于7,这里的“5”和“7”是字符串
awk -F ‘:’ ‘$3>1000 || $7!=”/sbin/nologin” ’ /root/passwd #第三段大于1000,或者第7段不等“nologin”,这里的1000是数字
这里写图片描述
awk -F ‘:’ ‘3>1000||7 ~ /bash/ ’ /root/passwd #第三段大于1000,或者第7段匹配bash

[root@wwlinux701 ~]# awk -F ':' '$3>1000 || $7 ~ /bash/ ' /root/passwd root:x:0:0:root:/root:/bin/bashww:x:1000:1000::/home/ww:/bin/bashuser2:x:1016:1087::/home/test:/sbin/nologinmysql:x:1017:1017::/home/mysql:/sbin/mologin[root@wwlinux701 ~]# 

head -5 /root/passwd | awk -F ‘:’ ‘{OFS=”#”} 3>1000||7 ~ /bash/ {print 1,3,$7}’ #OFS是内置变量,是为print时的分割符号,这里的语法顺序不能乱,一定要先OFS在后面的print

[root@wwlinux701 ~]# head -5 /root/passwd | awk -F ':' '{OFS="#"} {print $1,$3,$7}' root#0#/bin/bashbin#1#/sbin/nologindaemon#2#/sbin/nologinadm#3#/sbin/nologinlp#4#/sbin/nologin[root@wwlinux701 ~]# 

awk -F ‘:’ ‘{OFS=”#”} $3>1000 || $7 ~ /bash/ {print $1,$3,$7}’ /root/passwd #两个花括号中间写条件
awk -F ‘:’ ‘{OFS=”#”} {if ($3>1000) {print $1,$3,$7}}’ /root/passwd #规则写法,加上if条件判断

[root@wwlinux701 ~]# awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$3,$7}}' /root/passwduser2#1016#/sbin/nologinmysql#1017#/sbin/mologin[root@wwlinux701 ~]# 

NR和NF都为内置变量
head -3 /root/passwd | awk -F ‘:’ ‘{print NR”:”$0}’ #显示行号
head -3 /root/passwd | awk -F ‘:’ ‘{print NF”:”$0}’ # 显示段数
这里写图片描述

awk -F ‘:’ ‘NR<=10 && $1 ~ /root|sync/’ /root/passwd #前10行里面匹配第一段包含了root或者sync的行

[root@wwlinux701 ~]# awk -F ':' 'NR<=10 && $1 ~ /root|sync/' /root/passwd root:x:0:0:root:/root:/bin/bashsync:x:5:0:sync:/sbin:/bin/sync[root@wwlinux701 ~]# 

head -3 /root/passwd | awk -F ‘:’ ‘$1=”root”’ #第一段赋值为root,全部显示为root赋值后分隔符没了
head -3 test.txt | awk -F ‘:’ {OFS=”#”} ‘$1=”root”’
head -3 /root/passwd | awk -F ‘:’ ‘\$1==”root”’ #第一段等于root 的行

awk -F ‘:’ ‘{(tot=tot+$3)}; END {print tot}’ /root/passwd #第三段求和

:扩展
把这里面的所有练习题做一下
http://www.apelearn.com/study_v2/chapter14.html

原创粉丝点击