【译】 AWK教程指南 2概述
2.1 为什么用AWK
由于awk具有上述特色,在问题处理的过程中,可轻易使用awk来撰写一些小工具;这些小工具并非用来解决整个大问题,它们只扮演解决个别问题过程的某些角色,可通过Shell所提供的pipe将数据按需要传送给不同的小工具进行处理,以解决整个大问题。这种解题方式,使得这些小工具可因不同需求而被重复组合及使用(reuse);也可通过这种方式来先行测试大程序原型的可行性与正确性,将来若需要较高的执行速度时再用C语言来改写。这是awk最常被应用之处。若能常常如此处理问题,读者可以以更高的角度来思考抽象的问题,而不会被拘泥于细节的部分。本手册作为awk入门的学习指引,其内容将先强调如何撰写awk程序,未列入进一步解题方式的应用实例,这部分将留待UNIX进阶手册中再行讨论。
2.2 如何取得awk
一般的UNIX操作系统,本身即带有awk。不同的UNIX操作系统所带的awk其版本亦不尽相同。若读者所使用的系统上未带有awk,可通过anonymous ftp到下列地方取得:
phi.sinica.edu.tw:/pub/gnu
ftp.edu.tw:/UNIX/gnu
prep.ai.mit.edu:/pub/gnu
2.3 awk如何工作
为便于解释awk程序架构,及有关术语(terminology),先以一个员工薪资数据文件(emp.dat),来加以介绍。
数据文件中各字段依次为 员工ID、姓名、时薪 及 实际工时。ID中的第一个字母为部门识别码,"A"、"P"分别表示"组装"及"包装"部门。
本小节着重于说明awk程序的主要架构及工作原理,并对一些重要的名词加以必要的解释。通过学习这部分内容,读者可体会出awk语言的主要精神及awk与其它语程序言的差别。为便于说明,之后以条列方式说明。
- 名词定义
1. 记录(Record):awk从数据文件上读取数据的基本单位。以上列数据文件emp.dat为例,awk读入的
第一条记录是 "A125 Jenny 100 210"
第二条记录是 "A341 Dan 110 215"
一般而言, 一条 记录 就相当于数据文件上的一行资料。 (参考 : 附录 B 内建变量"RS")
2. 字段(Field):为记录中被分隔开的子字符串。以数据行"A125 Jenny 100 210"为例,
第一个 | 第二个 | 第三个 | 第四个 |
“A125" | "Jenny" | 100 | 210 |
一般是以空格符来分隔相邻的字段。( 参考:附录 D 内建变量"FS" )
- 如何执行AWK
在UNIX的命令行上输入下列格式的指令:("$"表示Shell命令行上的提示符号)
$ awk 'awk程序' 数据文件名
则awk会先编译该程序,然后执行该程序来处理所指定的数据文件。(上述方式直接把程序写在UNIX的命令行上)
- awk程序的主要结构:
awk程序中主要语法是 Pattern { Actions },故常见的awk程序其形式如下:
Pattern1 { Actions1 }
Pattern2 { Actions2 }
......
Pattern3 { Actions3 }
- Pattern 是什么 ?
awk 可接受许多不同形式的 Pattern。一般常使用 "关系表达式"(Relational expression)来当作 Pattern。
例如:
x > 34 是一个Pattern,判断变量 x 与 34 是否存在大于的关系。
x == y 是一个Pattern,判断变量 x 与变量 y 是否存在等于的关系。
上式中 x >34 、 x == y 便是典型的Pattern。
awk 提供 C 语言中常见的关系运算符(Relational Operators) 如 >, <, >=, <=, ==, !=。此外,awk 还提供 ~ (match) 及 !~(not match) 二个关系运算符(注一)。
其用法与涵义如下:
若 A 为一字符串,B 为一正则表达式(Regular Expression)
A ~ B 判断 字符串A 中是否 包含 能匹配(match)B表达式的子字符串。
A !~ B 判断 字符串A 中是否 不包含 能匹配(match)B表达式的子字符串。
例如 :
"banana" ~ /an/ 整个是一个Pattern。
因为"banana"中含有可以匹配 /an/ 的子字符串,故此关系式成立(true),整个Pattern的值也是true。
相关细节请参考 附录 A Patterns, 附录 E Regular Expression
(注一:) 有少数awk文献,把 ~, !~ 当成另一类的 Operator,并不视为一种 Relational Operator。本手册中将这两个运算符当成一种 Relational Operator。
- Actions 是什么?
Actions 是由许多awk指令构成。而awk的指令与 C 语言中的指令十分类似。
例如:
awk的 I/O指令:print, printf( ), getline, ...
awk的 流程控制指令:if(...){..} else{..}, while(...){...}, ...
(请参考 附录 B --- "Actions" )
- awk 如何处理 Pattern { Actions } ?
awk 会先判断(Evaluate) 该 Pattern 的值,若 Pattern 判断后的值为true (或不为0的数字,或不是空的字符串),则awk将执行该 Pattern 所对应的 Actions。反之,若 Pattern 的值不为 true,则awk将不执行该 Pattern所对应的 Actions。
例如:若awk程序中有下列两指令
50 > 23 {print "Hello! The word!!" }
"banana" ~ /123/ {print "Good morning !" }
awk会先判断 50 >23 是否成立。因为该式成立,所以awk将打印出"Hello! The word!!"。而另一 Pattern 为"banana"~/123/,因为"banana" 内未含有任何子字符串可 match /123/,该 Pattern 的值为false,故awk将不会打印出 "Good morning !"
- awk 如何处理{ Actions } 的语法?(缺少Pattern部分)
有时语法 Pattern { Actions }中,Pattern 部分被省略,只剩 {Actions}。这种情形表示 "无条件执行这个 Actions"。
- awk 的字段变量
awk 所内建的字段变量及其涵意如下 :
字段变量 |
含义 |
$0 |
一字符串,其内容为目前 awk 所读入的整行数据。 |
$1 |
$0 上第一个字段的数据。 |
$2 |
$0 上第二个字段的数据。 |
... |
其余类推 |
- 读入数据行时,awk如何更新(update)这些内置的字段变量?
1. 当 awk 从数据文件中读取一行数据时,awk 会使用内置变量$0 予以记录。
2. 每当 $0 被改动时 (例如:读入新的数据行 或 自行变更 $0) awk 会立刻重新分析 $0 的字段情况,并将 $0 上各字段的数据用 $1、$2、...等予以记录。
- awk的内置变量(Built-in Variables)
awk 提供了许多内置变量,使用者在程序中可使用这些变量来取得相关信息(不用加$)。常见的内置变量有:
内置变量 |
含义 |
NF (Number of Fields) |
为一整数,其值表示$0上所存在的字段总数。 |
NR (Number of Records) |
为一整数,其值表示awk已读入的数据行数目。 |
FILENAME |
awk正在处理的数据文件名。 |
例如 : awk 从数据文件 emp.dat 中读入第一行记录"A125 Jenny 100 210" 之后,程序中:
$0 的值将是 "A125 Jenny 100 210"
$1 的值为 "A125" $2 的值为 "Jenny"
$3 的值为 100 $4 的值为 210
NF 的值为 4 $NF 的值为 210 (笔者注:$NF即为$4)
NR 的值为 1 FILENAME 的值为 "emp.dat"
- awk的工作流程 :
执行awk时,它会反复进行下列四步骤。
- 自动从指定的数据文件中读取一个数据行。
- 自动更新(Update)相关的内置变量的值。如:NF, NR, $0...
- 依次执行程序中 所有 的 Pattern { Actions } 指令。
- 当执行完程序中所有 Pattern { Actions } 时,若数据文件中还有未读取的数据,则反复执行步骤1到步骤4。
awk会自动重复进行上述4个步骤,使用者不须在程序中编写这个循环 (Loop)。
【译】 AWK教程指南 2概述的更多相关文章
- 【译】 AWK教程指南
前面的话: 这几天写了一个程序,在同一个目录里生成了很多文件,需要统计其中部分文件的总大小,发现经常用到的ls.du等命令都无济于事,我甚至都想到了最笨的方法,写一个脚本:mkdir一个新目录,把要统 ...
- 【译】 AWK教程指南 1前言
前面的话: 这几天写了一个程序,在同一个目录里生成了很多文件,需要统计其中部分文件的总大小,发现经常用到的ls.du等命令都无济于事,我甚至都想到了最笨的方法,写一个脚本:mkdir一个新目录,把要统 ...
- 【译】 AWK教程指南 附录E-正则表达式
为什么要使用正则表达式 UNIX 中提供了许多 指令 和 tools,它们具有在文件中 查找(Search)字串或替换(Replace)字串 的功能.像 grep, vi , sed, awk,... ...
- 【译】 AWK教程指南 附录D-AWK的内置变量
因内置变量的个数不多,此处按其相关性分类说明,并未按其字母顺序排列. ARGC ARGC表示命令行上除了选项 -F, -v, -f 及其所对应的参数之外的所有参数的个数.若将"awk程序&q ...
- 【译】 AWK教程指南 附录C-AWK的内建函数
C.1 字串函数 index( 原字串, 查找的子字串 ) 若原字串中含有欲寻找的子字串,则返回该子字串在原字串中第一次出现的位置,若未曾出现该子字串则返回0. 例如: $ awk 'BEGIN{ p ...
- 【译】 AWK教程指南 附录B-Actions
Actions 是由下列指令(statement)所组成: 表达式 ( 函数调用,赋值...) print 表达式列表 printf( 格式化字符串, 表达式列表) if( 表达式 ) 语句 [els ...
- 【译】 AWK教程指南 附录A-Patterns
awk 通过判断 Pattern 的值来决定是否执行其后所对应的Actions.这里列出几种常见的Pattern: A.1 BEGIN BEGIN 为 awk 的保留字,是一种特殊的 Pattern. ...
- 【译】 AWK教程指南 11递归程序
awk 中除了函数的参数列表(Argument List)上的参数(Arguments)外,所有变量不管于何处出现,全被视为全局变量.其生命持续至程序结束——该变量不论在function外或 func ...
- 【译】 AWK教程指南 10编写可与用户交互的AWK程序
执行awk程序时,awk会自动从文件中读取数据来进行处理,直到文件结束.只要将awk读取数据的来源改成键盘输入,便可设计与awk 交互的程序.本节将提供一个该类程序的范例. 范例:本节将编写一个英语生 ...
随机推荐
- struts2 标签库 介绍
struts2.0里的标签没有分类,只用在jsp头文件加上<%@ taglib prefix="s" uri="/struts-tags" %>就能 ...
- CyanogenMod刷机以及Google Play应用商店安装方法介绍
http://blog.csdn.net/zcynical/article/details/19241595 写在前面: 本文介绍的方法除第一步外,适用于所有CM系统支持的设备,第一步由于用到了PC上 ...
- cocos2d-html5 onEnter init ctor构造函数 ----js特有特性(和c++有一点不一样)
ctor 构造函数, new 一个对象的时候调用-----coco2d-js , 默认ctor,为对象的构造函数,其它也可以默认其它函数为构造函数. 说白了就是: ctor构造函数 new 对象后自动 ...
- MyBatis-Spring 执行SQL语句的流程
1. 从SqlSessionDaoSupport开始 通常我们使用MyBatis会让自己的DAO继承SqlSessionDaoSupport,那么SqlSessionDaoSupport是如何运作的呢 ...
- 使用Nginx+Keepalived组建高可用负载平衡Web server集群
一,首先说明一下网络拓扑结构: 1,Nginx 反向代理Server(HA): ①Nginx master:192.168.1.157 ②Nginx backup:192.168.1. ...
- iphone6S“玫瑰金”的秘密——阳极氧化
阳极氧化对多数人来说是一个熟悉又陌生的名词,大多数可能知道它的作用之一就是是能使金属呈现各种各样色彩.最为人熟知的运用阳极氧化技术的产品就是iphone系列产品了,已经推出了金色,玫瑰金色,深空灰色, ...
- 初始化D3D设备
bool initD3D(HWND hWnd) { // 主要目的是获取设备,为调用下面的函数做很多准备. // 比如 获取IDirect3D9 ,获取支持的顶点处理,填充后备缓冲相关参数等. // ...
- 搜索引擎spam
什么是SPAM?搜索引擎优化中的SPAM 在搜索引擎优化相关的文章中中经常遇到“SPAM”一词,SPAM通常用来指垃圾邮件,不过在搜索引擎营销中所说的SPAM是专门针对那些欺骗搜索引擎的信息.搜索引擎 ...
- 同步or异步
一.什么是同步?什么是异步? 同步:如果有多个任务要执行,这些任务必须逐个执行,一个任务的执行会导致整个流程的暂时等待,这些任务没有办法并发地执行: 异步:如果有多个任务要执行,这些任务可以并发执行, ...
- Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析[转]
前面在介绍Android系统的开机画面时提到,Android设备的显示屏被抽象为一个帧缓冲区,而Android系统中的SurfaceFlinger服务就是通过向这个帧缓冲区写入内容来绘制应用程序的用户 ...