Linux之awk匹配规则(二)
1.awk匹配模式
在 awk [参数] '匹配规则 + {执行命令}' 文件名 基本格式中
'匹配规则 + {执行命令}'
(两者可以只有一个,但不可以一个没有,脚本命令 必须 用 '' 括起来;当 匹配规则 为 字符串和正则表达式 的时候,需要使用 "/…/" 符合括起来;
而 执行命令 需要用 {} 括起来!还有,执行 awk 的时候,如果 不指定 匹配规则,则默认匹配文中的 所有行,如果 不指定 执行命令 ,则默认会把 匹配到的所有行输出。)
2.awk实例
匹配规则总结:
匹配规则可以是以下的任意一个:
①、/ 正则表达式 / :使用通配符的扩展集。
②、关系表达式 : 使用 运算符 进行操作,可以是字符串或数字的比较测试。
③、模式匹配表达式:用 运算符 ~(匹配) 和 ~!(不匹配)。
④、BEGIN 语句块、 pattern 语句块、END语句块。
awk的常规表达式元字符::
/^abc/ 表示以abc开头,其中^表示在行首位置进行匹配。 /abc$/ 表示以abc结尾,其中$表示在行尾位置进行匹配。 /abc/ 表示当前记录行中只要有abc串就可以。 /[a-d]/ 表示与a-d中的任意一个字符匹配。即当前行中只要有a-d中的任意一个字符就匹配成功。 /[acwy]/表示与a、c、w、y中的任意一个字符匹配。即当前行中只要有a、c、w、y中的任意一个字符就匹配成功。 /[^a-d]/表示不与a-d中的任意一个字符做匹配。等等。 /DESK|CHAIR/表示与DESK匹配或与DESK匹配。 /[ABC]*/ 表示与A、B、C中任意一个出现0次或多次的字符相匹配。 /[ABC]+/ 表示与A、B、C中任意一个出现1次或多次的字符相匹配。 /./ 表示任意一个字符,“.”表示任意一个字符。
2.1 测试文本
cat bwk.txt
[root@localhost home]# cat bwk.txt
name age sex home
jack 18 男 /home/jack/
ben 28 男 /home/ben/
hilun 38 女 /home/hilun/
wumen 48 男 /home/wumen/
hen 55 男 /home/hen/
jj 42 男 /home/jj/
bo 23 男 /home/bo/
wen 31 女 /home/wen/
wuwu 22 女 /home/wuwu/
hihi 25 女 /home/hihi/
[root@localhost home]#
2.2 只存在匹配规则下(使用正则表达式/.../)
[root@localhost home]# awk '/bo/' bwk.txt
bo 23 男 /home/bo/
[root@localhost home]#
2.3 查询30岁以下且带h的人员信息 (正则表达式/.../)
[root@localhost home]# awk '$2 <=30 && /w/' bwk.txt
wuwu 22 女 /home/wuwu/
[root@localhost home]#
2.4 正则表达式查询路径,需要转义字符(使用正则表达式/.../)
[root@localhost home]# awk '/\/home\/bo\//' bwk.txt
bo 23 男 /home/bo/
[root@localhost home]#
注:/需要转义,不然会报错
[root@localhost home]# awk '//home/bo//' bwk.txt
awk: cmd. line:1: //home/bo//
awk: cmd. line:1: ^ unexpected newline or end of string
[root@localhost home]#
2.5 使用匹配表达式 ~
[root@localhost home]# awk '$1 ~ "en" ' bwk.txt
ben 28 男 /home/ben/
wumen 48 男 /home/wumen/
hen 55 男 /home/hen/
wen 31 女 /home/wen/
[root@localhost home]#
2.6 使用匹配表达式排查!~
[root@localhost home]# awk '$1 !~ "en"' bwk.txt
name age sex home
jack 18 男 /home/jack/
hilun 38 女 /home/hilun/
jj 42 男 /home/jj/
bo 23 男 /home/bo/
wuwu 22 女 /home/wuwu/
hihi 25 女 /home/hihi/
2.7 awk 分号和逗号的区别
,(逗号) 表示的是一个范围,就是逗号前到逗号后作为一个范围。
;(分号) 表示的是隔开,分号前 和 分号后 没有联系。
[root@localhost home]# cat bwk.txt
name age sex home
jack 18 男 /home/jack/
ben 28 男 /home/ben/
hilun 38 女 /home/hilun/
wumen 48 男 /home/wumen/
hen 55 男 /home/hen/
jj 42 男 /home/jj/
bo 23 男 /home/bo/
wen 31 女 /home/wen/
wuwu 22 女 /home/wuwu/
hihi 25 女 /home/hihi/
[root@localhost home]# awk '$1 ~ "k",$1 ~ "u"' bwk.txt
jack 18 男 /home/jack/
ben 28 男 /home/ben/
hilun 38 女 /home/hilun/
[root@localhost home]# awk '$1 ~ "k";$1 ~ "u"' bwk.txt
jack 18 男 /home/jack/
hilun 38 女 /home/hilun/
wumen 48 男 /home/wumen/
wuwu 22 女 /home/wuwu/
[root@localhost home]#