【译】 AWK教程指南 附录A-Patterns
awk 通过判断 Pattern 的值来决定是否执行其后所对应的Actions。这里列出几种常见的Pattern:
A.1 BEGIN
BEGIN 为 awk 的保留字,是一种特殊的 Pattern。
BEGIN 成立(其值为true)的时机是:
"awk 程序一开始执行,尚未读取任何数据之前。"
所以在 BEGIN { Actions } 语法中,其 Actions 部份仅于程序一开始执行时被执行一次。当 awk 从数据文件读入数据行后, BEGIN 便不再成立,故不论有多少数据行,该 Actions 部份仅被执行一次。
一般常把 "与数据文件内容无关" 与 "只需执行一次" 的部分置于该Actions(以 BEGIN 为 Pattern)中。
例如:
BEGIN {
FS = "[ \t:]" # 于程序一开始时, 改变awk切割字段的方式
RS = "" # 于程序一开始时, 改变awk分隔数据行的方式
count = # 设定变量 count 的起始值
print " This is a title line " # 印出一行 title
}
.......
# 其它 Pattern { Actions }
.....
有些awk程序甚至"不需要读入任何数据行"。遇到这情况可把整个程序置于以 BEGIN 为 Pattern的 Actions 中。
例如:
BEGIN { print " Hello ! the Word ! " }
注意:执行该类仅含 BEGIN { Actions } 的程序时,awk 并不会开启任何数据文件进行处理。
A.2 END
END 为 awk 的保留字,是另一种特殊的 Pattern。
END 成立(其值为true)的时机与 BEGIN 恰好相反,为:
"awk 处理完所有数据,即将离开程序时"
平常读入数据行时,END并不成立,故其对应的 Actions 并不被执行;唯有当awk读完所有数据时,该 Actions 才会被执行。
注意:不管数据有多少行,该 Actions 仅被执行一次。
A.3 关系表达式
使用像 " A 关系运算符 B" 的表达式当成 Pattern。
当 A 与 B 存在所指定的关系(Relation)时,该 Pattern 就算成立(true)。
例如:
length($) <= { print $ }
上式中 length($0) <= 80 是一个 Pattern,当 $0(数据行)的长度小于等于80时该 Pattern 的值为true,将执行其后的 Action (打印该行数据)。
awk 中提供下列 关系运算符(Relation Operator)
| 运算符 | 含意 |
| > | 大于 |
| < | 小于 |
| >= | 大于或等于 |
| <= | 小于或等于 |
| == | 等于 |
| != | 不等于 |
| ~ | match |
| !~ | not match |
上列关系运算符除~(match)与!~(not match)外,与 C 语言中的含意一致。
~(match) 与!~(match) 在 awk 的含意简述如下:
若 A 为一字符串,B 为一正则表达式:
- A ~ B 判断 字符串A 中是否 包含 能匹配(match)B式样的子字符串。
- A !~ B 判断 字符串A 中是否 未包含 能匹配(match)B式样的子字符串。
例如:
$ ~ /program[-]+\.c/ { print $ }
$0 ~ /program[0-9]+\.c/ 整个是一个 Pattern,用来判断$0(数据行)中是否含有可 match /program[0-9]+\.c/ 的子字符串,若$0 中含有该类字符串,则执行 print (打印该行数据)。
Pattern 中被用来比对的字符串为$0 时(如本例),可仅以正则表达式部分表示整个Pattern。故本例的 Pattern 部分$0 ~/program[0-9]+\.c/ 可仅用/program[0-9]+\.c/表之(有关匹配及正则表达式请参考 附录 E )
A.4 正则表达式
直接使用正则表达式当成 Pattern,此为 $0 ~ 正则表达式 的简写。
该 Pattern 用以判断 $0(数据行) 中是否含有匹配该正则表达式的子字符串,若含有,该式成立(true),则执行其对应的 Actions。
例如:
/^[-]*$/ { print "This line is an integer !" }
与
$ ~ /^[-]*$/ { print "This line is an integer !" }
相同。
A.5 混合Pattern
之前所介绍的各种 Patterns,其计算后结果为一逻辑值(True or False)。awk 中逻辑值彼此间可通过&&(and)、||(or)、!(not) 结合成一个新的逻辑值。故不同 Patterns 彼此可通过上述结合符号来结合成一个新的 Pattern。如此可进行复杂的条件判断。
例如:
FNR >= && FNR <= { print " " $ }
上式利用&& (and) 将两个 Pattern 求值的结果合并成一个逻辑值。该式将数据文件中 第23行 到 28行 向右移5格(先输出5个空白字符)后输出。( FNR 为awk的内置变量, 请参考 附录 D )
A.6 Pattern1, Pattern2
遇到这种 Pattern(笔者注:逗号表达式),awk 会帮您设立一个 switch(或flag)。
- 当awk读入的数据行使得 Pattern1 成立时,awk 会打开(turn on)这个 switch
- 当awk读入的数据行使得 Pattern2 成立时,awk 会关上(turn off)这个 switch
该 Pattern 成立的条件是:
当这个 switch 被打开(turn on)时 (包括 Pattern1 或 Pattern2 成立的情况)
例 如:
FNR >= && FNR <= { print " " $ }
可改写为
FNR == , FNR == { print " " $ }
说 明:
当 FNR >= 23 时,awk 就 turn on 这个 switch;因为随着数据行的读入,awk不停的累加 FNR。当 FNR = 28 时,Pattern2 (FNR == 28) 便成立,这时 awk 会关上这个 switch。
当 switch 打开的期间,awk 会执行 print " " $0
( FNR 为awk的内置变量, 请参考 附录 D )
【译】 AWK教程指南 附录A-Patterns的更多相关文章
- 【译】 AWK教程指南 附录E-正则表达式
为什么要使用正则表达式 UNIX 中提供了许多 指令 和 tools,它们具有在文件中 查找(Search)字串或替换(Replace)字串 的功能.像 grep, vi , sed, awk,... ...
- 【译】 AWK教程指南 附录D-AWK的内置变量
因内置变量的个数不多,此处按其相关性分类说明,并未按其字母顺序排列. ARGC ARGC表示命令行上除了选项 -F, -v, -f 及其所对应的参数之外的所有参数的个数.若将"awk程序&q ...
- 【译】 AWK教程指南 附录B-Actions
Actions 是由下列指令(statement)所组成: 表达式 ( 函数调用,赋值...) print 表达式列表 printf( 格式化字符串, 表达式列表) if( 表达式 ) 语句 [els ...
- 【译】 AWK教程指南 附录C-AWK的内建函数
C.1 字串函数 index( 原字串, 查找的子字串 ) 若原字串中含有欲寻找的子字串,则返回该子字串在原字串中第一次出现的位置,若未曾出现该子字串则返回0. 例如: $ awk 'BEGIN{ p ...
- 【译】 AWK教程指南
前面的话: 这几天写了一个程序,在同一个目录里生成了很多文件,需要统计其中部分文件的总大小,发现经常用到的ls.du等命令都无济于事,我甚至都想到了最笨的方法,写一个脚本:mkdir一个新目录,把要统 ...
- 【译】 AWK教程指南 1前言
前面的话: 这几天写了一个程序,在同一个目录里生成了很多文件,需要统计其中部分文件的总大小,发现经常用到的ls.du等命令都无济于事,我甚至都想到了最笨的方法,写一个脚本:mkdir一个新目录,把要统 ...
- 【译】 AWK教程指南 2概述
2.1 为什么用AWK 由于awk具有上述特色,在问题处理的过程中,可轻易使用awk来撰写一些小工具:这些小工具并非用来解决整个大问题,它们只扮演解决个别问题过程的某些角色,可通过Shell所提供的p ...
- 【译】 AWK教程指南 10编写可与用户交互的AWK程序
执行awk程序时,awk会自动从文件中读取数据来进行处理,直到文件结束.只要将awk读取数据的来源改成键盘输入,便可设计与awk 交互的程序.本节将提供一个该类程序的范例. 范例:本节将编写一个英语生 ...
- 【译】 AWK教程指南 4通过文本内容和对比选择指定的记录
Pattern { Action }为awk中最主要的语法.若某Pattern的值为真则执行它后面的 Action. awk中常使用"关系表达式" (Relational Expr ...
随机推荐
- Elasticsearch从0.90到1.2的不兼容变化-系统和设置
本文为官方文档的翻译加个人理解.作者翻译时,elasticsearch(下面简称es)的版本为1.2.1. 1.系统级别及设置方面 1.1 es启动时,默认是作为一个前台程序启动.如果你想让e ...
- 1044: [HAOI2008]木棍分割 - BZOJ
Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...
- obj转换成数组
原则上obj是不能转换成数组的.首先array也是obj.只是一个特殊的object. obj一个很关键的点,是拥有成员和方法,撇开方法不说,obj就是一个key-value结构.也就是哈希数组,而j ...
- Aimp3的播放列表 按评分排序 落雨
如图,添加评分选项,并保存,就可以在下图的选项里找到此选项,并按评分排序 效果图如下:还可以倒置,迅速使评分高的音乐排在播放列表的前面位置!! 转自百度知道: http://zhidao.baidu. ...
- hibernate hql 大全
Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL.但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承.多态 和关联之类的概念. ...
- 谈谈js中for in 需要注意的地方
js中for in 可以遍历对象或数组的显性属性,也就是说我们自己定义的属性是可以遍历的,那些原型上默认已有的属性,例如:Object.prototype.toString.Object.protot ...
- Maven SDK
Maven SDK Details Print Tags: development maven maven2 liferay v6.0 Table of Contents [-] Introdu ...
- 学习记录:浏览器JAVASCRIPT里的WINDOWS,DOCUMNET
看完以下这段话之后,就理解DOCUMNET.READY之类的说法了. 或是JAVASCRIPT的浏览器里更细致的操作DOCUMENT的东西了. DOCUMNET和WINDOWS谁大谁小, 立即执行的匿 ...
- iOS开发UI篇—程序启动原理和UIApplication1
iOS开发UI篇—程序启动原理和UIApplication 一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...
- cocos2d-x 多分辨率适配详解(转载),以前北京团队设计的游戏,也是用这套方案
http://blog.csdn.net/kyo7552/article/details/17163487 多种分辨率的适配一直都是一个蛋疼的问题,各家公司可能都有自己的一套方案.今天我为大家介绍的是 ...