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]# 

 


posted @ 2022-08-25 15:13  家乐福的搬砖日常  阅读(2674)  评论(0编辑  收藏  举报