在上文 awk(1)-简述我们将简要描述了awk的主要使用方向和构成(由一个或多个模式-动作组成),本小节主要讲述awk的各种模式。

ps:例子中使用的输入文件(如countries)内容可由awk(1)-简述获取

模式是什么

ls -l | awk 'NR > 1 && $5 > 1024 {print $9}' //打印当前目录下面,大小大于1K(1024)的文件或目录名称

加粗字体部分即为模式,由此可见模式的主要作用是用于匹配.

有多少种模式

awk programing中作者将awk的模式分为6种,在此处我更倾向于分为下面4类模式:

(1).BEGIN/END(开始和结束执行的特殊模式)

(2).express(判断表达式,包含单个或使用逻辑运算符组合的多个判断,如: $5 != 10 || $3 == 3)

(3)./reg/(正则表达式的匹配)

(4)./pattern1/,/pattern2/(范围表达式)

3.模式的使用

(1).BEGIN/END

BEGIN/END 不匹配任何输入行,BEGIN在awk读取输入前执行,END在awk完成输入后执行

比如:

awk  'BEGIN{FS="\|\|";print "=====================";printf("%.4s\t%.10s\n","ID","Name")} {printf("%.4s\t%.10s\n",$1,$2)} END{print "====================="}' worker.txt

输出为:

=====================
ID    Name
1      Jack
2      Lip
=====================

FS说明:

FS为awk的内置变量,用于设定当前输入记录的分隔符. 默认为空格,可以使用命令行选项-F替代.

如上面的例子等价于:

awk  -F "\|\|" 'BEGIN{print "=====================";printf("%.4s\t%.10s\n","ID","Name")} {printf("%.4s\t%.10s\n",$1,$2)} END{print "====================="}' worker.txt

上面的例子中我们设定FS="\|\|"(多字符,且添加转义字符\),那么FS设定的匹配规则是什么?

如果将一个字符赋值给FS,那么记录的分隔符就为单个字符(不管是否为元字符)

如果将一个字符串(length>1)赋值给FS,那么它就会替换成一个正则表达式.

关于awk的正则表达式的匹配规则,我们将在(3)/reg/字符串匹配描述.

(2).express

该模式主要是 常规运算符如: <,>..,配合常规逻辑运算符 &&,||..等使用,使用方式类似于:
if(express){
    //do something
}

如:

ls -l | awk 'NR > 1 {print}' //输出去除了ls –l的总用量一行的内容

输出为:

-rw-rw-r-- 1 fengyun fengyun 266 11月 21 13:16 countries
-rw-rw-r-- 1 fengyun fengyun   0 11月 21 13:16 empty.txt
-rw-rw-r-- 1 fengyun fengyun  61 11月 17 13:20 worker.txt

ps:print 后面不接任何内容的话,默认为$0

(3)/reg/ 字符串匹配

一个字符串匹配模式 (string-matching pattern) 测试一个字符串是否包含一段可以被正则表达式

关于/reg/的匹配存在3种方式:

(1)./reg/ //匹配整个输入行即没有使用默认的字段即使用$0

如:

awk '/Asia/ {printf("%-5s belongs to Asia\n",$1)}' countries

输出为:

USSR  belongs to Asia
China belongs to Asia
India belongs to Asia
Japan belongs to Asia

(2).expression ~/reg/ //匹配单个被分隔的项目,比如$1,$2

如:
awk '$4 ~ /Asia/ {printf("%-5s belongs to Asia\n",$1)}' countries
输出为:
USSR  belongs to Asia
China belongs to Asia
India belongs to Asia
Japan belongs to Asia

(3).expression !~/r //不包含为true

如:
awk '$4 !~ /Asia/ {printf("%-7s not belongs to Asia\n",$1)}' countries
输出为:
Canada  not belongs to Asia
USA     not belongs to Asia
Brazil  not belongs to Asia
Mexico  not belongs to Asia
France  not belongs to Asia
Germany not belongs to Asia
England not belongs to Asia

另外awk支持regular符号表见下(元字符)

元字符 含义 例子
\

转义字符

awk  -F "\|\|" {print $1} worker.txt//打印每条记录的第1个字段
^

匹配一行的开始,在[]中表示非

awk '/^[^U]/ {print}' countries //匹配不以U为开头的记录
$

匹配一行的结束

awk '/a$/ {print}' countries //记录匹配以a为结尾
[ ] [ ] 匹配一个范围如:[A-Za-z]或[^0-9] awk '$1~/[A-G]/ {print $0}' countries//第1个字段匹配存在A-G字母(范围)
| awk '$1~/A|B/ {print $0}' countries//第1个字段匹配存在A或B字母
( ) 匹配一个字符串 awk '$1~/(USA)/ {print $0}' countries//第1个字段匹配为USA的记录
.

匹配任意1个字符(有且仅有1个)

awk '$4 ~/^A..a$/ {print}' countries //第4个字段匹配以A开头且结尾为a的4个字符的
+

匹配1或多个字符

awk '$1~/US+/ {print $0}' countries//第1个字段匹配存在US或USS等多个S
?

匹配 0 或 1个字符

awk '$1~/S?/ {print $0}' countries //第1个字段匹配存在0或1个S
* 匹配0或多个字符 awk '$1~/S*/ {print $0}' countries //第1个字段匹配存在0或多个个S

awk中正则的组合符号主要是直接组合(reg1)(regs)或reg1|reg2
比如:
(Asian|European|North American) (male|female) (black|blue)bird
一共匹配12种字符串,由Asian male blackbird到North American female bluebird

如在worker.txt新增1行:3**Mario||27||female||Japan

此时FS可以写成:awk -F "\|\| | \*\*" '{print $1}' worker.txt

ps:

由[](范围-互补)中,内部的字符即使需要直接对元字符的匹配也不需要进行转义,
比如: ^[^^] 匹配不以^字符开始的字符串.

采用其余方式使用元字符进行字符串匹配的都需要对元字符进行转义,
比如:awk '/^(\^)+/ {print $0}' countries //匹配以一个^或多个^^为首的字符串

(4)pattern1,pattern2(范围表达式)

一个范围模式由两个逗号分开的模式组成,范围匹配如:/reg1/,/reg2/

比如:

awk '/USSR/,/Japan/ {print}' countries //文档匹配USSR到Japan 的字符串
输出:
USSR 8649 275 Asia
Canada 3852 25 North America
China 3705 1032 Asia
USA 3615 237 North America
Brazil 3286 134 South America
India 1267 746 Asia
Mexico 762 78 North America
France 211 55 Europe
Japan 144 120 Asia

4.总结

本节主要描述了构成awk两大元素之一的模式(pattern),awk的模式主要可以分为4类:

1.BEGIN/END

2.常规表达式

3.正则匹配

4.范围匹配

其中正则表达式的难度最大,需要更多时间的加以实践

5.参考

awk(2)-模式(pattern)的更多相关文章

  1. awk模式pattern

    awk模式pattern 再来回顾下awk的语法 awk [option] 'pattern[action]' file ... awk是按行处理文本,刚才讲解了print动作,现在讲解特殊的patt ...

  2. Redis Keys 命令 - 查找所有符合给定模式( pattern)的 key

    Redis Keys 命令用于查找所有符合给定模式 pattern 的 key .. 语法 redis KEYS 命令基本语法如下: redis 127.0.0.1:6379> KEYS PAT ...

  3. 如何使用 awk 按模式筛选文本或字符串

    在筛选文本时,有时你可能想根据某个给定的条件或使用一个可被匹配的特定模式,去标记某个文件或数行字符串中的某几行.使用 awk 来完成这个任务是非常容易的,这也正是 awk 中可能对你有所帮助的几个功能 ...

  4. 正则表达式(即:匹配模式Pattern)

    通过学习<正则表达式-Regular-Expression-Tutorial.pdf>这份文档,对正则表达式有了很好的了解,原因只有1个--这份文档写得太好了. 它的下载地址是:http: ...

  5. grep使用技巧一:模式pattern为字符串文件

    pattern文件: antc  areq  bdos  bogt   …… igs.txt文件: abmf    298.4725   16.2623   abpo     47.2292  -19 ...

  6. 桥接模式-pattern系列

    git链接 桥接模式 桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化".这句话有三个关键词,也就是抽象化. ...

  7. awk应用

    h3 { color: rgb(255, 255, 255); background-color: rgb(30,144,255); padding: 3px; margin: 10px 0px } ...

  8. [Swift]LeetCode890. 查找和替换模式 | Find and Replace Pattern

    You have a list of words and a pattern, and you want to know which words in words matches the patter ...

  9. 给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式。 这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应模式。

    这个是LeetCode上的一道题目.本机上运行时正确的,但是LeetCode上显示是错误的,所以没有办法了只能记录在博客上了. 我的想法是先把pattern和str都转化成数组.例如"abb ...

随机推荐

  1. SwitchHosts—hosts管理利器

    SwitchHosts是一个管理.快速切换Hosts小工具,开源软件,一键切换Hosts配置,非常实用,高效.开发Web过程成,部署有多套环境,网址域名都相同,部署在不同的服务器上,有开发环境.测试环 ...

  2. CentOS 6中MATLAB print函数“所见非所得”bug的解决方案

    0 系统配置+软件版本 主机:Dell optiplex 390 MT (i5) 系统+软件:CentOS 6.5 x64, Matlab R2012, R2013 系统+软件:CentOS 6.7 ...

  3. 日常小测:颜色 && Hackerrank Unique_colors

    题目传送门:https://www.hackerrank.com/challenges/unique-colors 感谢hzq大神找来的这道题. 考虑点分治(毕竟是路经统计),对于每一个颜色,它的贡献 ...

  4. 【PCB】【AD使用】Altium Designer 的entry sheet ,offsheet和port作用

    Altium Designer之多图纸设计 1.图纸结构 图纸包括两种结构关系: 一种是层次式图纸,该连接关系是纵向的,也就是某一层次的图纸只能和相邻的上级或下级有关系: 另一种是扁平式图纸,该连接关 ...

  5. STEP模块——电子钟

    原理 显示时分秒(日期也可以加上),两个按键调节时间 原理图 代码 /*---------------------------------------------------------------- ...

  6. javascript类继承的一些实验

    其实一开始编js没怎么用过对象,一般都用func,func,func···但是用多了,感觉代码一点都不美观,还要这里包一个函数,那里包一个函数,或者一直都是函数调用,不好看,而且一些重用的都要重写的话 ...

  7. Android 设置ListView当前显示的item

    项目中可能会有这种需求:动态设置ListView显示的item 这种需求可能会出现在不同的情况下,有的是打开页面就要显示在特定的位置,也有的是浏览列表时实时更新数据并且改变了集合中数据,或者是某种条件 ...

  8. 易云盘(nester)-面对企业的和团队文档管理的平台

    易云盘(nester)是本人的另外一款作品,先前开发和维护的在线设计工具Visor也已经合并在Nester的最新版里了. 目前作为共享版发布. 特点 Nester后端是以Spring Framewor ...

  9. JavaScript 继承

    许多OO语言都支持两种继承方式,接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.由于在ECMAScript中,函数没有签名,无法实现接口继承,只支持实现继承,而且其实现继承主要 ...

  10. learn python, ref, diveintopython 分类: python 2015-07-22 14:42 14人阅读 评论(0) 收藏

    for notes of learing python. // just ignore the ugly/wrong highlight for python code. ""&q ...