没有合适的资源?快使用搜索试试~ 我知道了~
awk+手册中文版归纳.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 194 浏览量
2022-03-15
10:11:32
上传
评论
收藏 363KB PDF 举报
温馨提示
试读
48页
awk+手册中文版归纳.pdf
资源推荐
资源详情
资源评论
1
awk 手册
简体中文版由 bones7456 (
bones7456@gmail.com
)整理 .
原文 :应该是
http://phi.sinica.edu.tw/aspac/reports/94/94011/
但是原文很乱 .
说明 :之前也是对 awk 几乎一无所知 ,无意中看到这篇文章 ,网上一搜 ,居然没有像样的简体中文版 .有的也是不怎么完整 ,或者错误
一大堆的 .于是就顺手整理了下这篇文章 .通过整理这篇文章 ,自己也渐渐掌握了 awk 的种种用法 .
原文可能比较老 ,有些目前已经不适用的命令有所改动 ,文中所有命令均在 ubuntu7.04 下调试通过 , 用的 awk 是 mawk.
由于本人能力有限 ,错误和不妥之处在所难免 ,欢迎多多指正 .
1. 前言
有关本手册 :
这是一本 awk 学习指引 , 其重点着重于 :
awk 适于解决哪些问题 ?
awk 常见的解题模式为何 ?
为使读者快速掌握 awk 解题的模式及特性 , 本手册系由一些较具代表性的范例及其题解所
构成 ; 各范例由浅入深 , 彼此间相互连贯 ,范例中并对所使用的 awk 语法及指令辅以必要的
说明 . 有关 awk 的指令 , 函数 ,...等条列式的说明则收录于附录中 , 以利读者往后撰写程序时
查阅 . 如此编排 , 可让读者在短时间内顺畅地学会使用 awk 来解决问题 . 建议读者循着范例
上机实习 , 以加深学习效果 .
读者宜先具备下列背景 :
[a.] UNIX 环境下的简单操作及基本概念 .
例如 : 文件编辑 , 文件复制 及 管道 , 输入 /输出重定向 等概念
[b.] C 语言的基本语法及流程控制指令 .
(awk 指令并不多 , 且其中之大部分与 C 语言中之用法一致 , 本手册中对该类指令之语法及
特性不再加以繁冗的说明 , 读者若欲深究 ,可自行翻阅相关的 C 语言书籍 )
2. awk 概述
为什么使用 awk
awk 是一种程序语言 . 它具有一般程序语言常见的功能 .
因 awk 语言具有某些特点 , 如 : 使用直译器 (Interpreter) 不需先行编译 ; 变量无类型之分
(Typeless), 可使用文字当数组的下标 (Associative Array)... 等特色 . 因此 , 使用 awk 撰写程序
比起使用其它语言更简洁便利且节省时间 . awk 还具有一些内建功能 , 使得 awk 擅于处理具
数据行 (Record), 字段 (Field) 型态的资料 ; 此外 , awk 内建有 pipe 的功能 , 可将处理中的数据
传送给外部的 Shell命令加以处理 , 再将 Shell 命令处理后的数据传回 awk 程序 , 这个特点也
使得 awk 程序很容易使用系统资源 .
由于 awk 具有上述特色 , 在问题处理的过程中 , 可轻易使用 awk 来撰写一些小工具 ; 这些小
工具并非用来解决整个大问题 ,它们只扮演解决个别问题过程的某些角色 , 可藉由 Shell 所提
2
供的 pipe 将数据按需要传送给不同的小工具进行处理 , 以解决整个大问题 . 这种解题方式 ,
使得这些小工具可因不同需求而被重复组合及重用 (reuse); 也可藉此方式来先行测试大程
序原型的可行性与正确性 , 将来若需要较高的执行速度时再用 C 语言来改写 .这是 awk 最常
被应用之处 . 若能常常如此处理问题 , 读者可以以更高的角度来思考抽象的问题 , 而不会被
拘泥于细节的部份 .
本手册为 awk 入门的学习指引 , 其内容将先强调如何撰写 awk 程序 ,未列入进一步解题方式
的应用实例 , 这部分将留待 UNIX 进阶手册中再行讨论 .
如何取得 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
awk 如何工作
为便于解释 awk 程序架构 , 及有关术语 (terminology), 先以一个员工薪资档 (emp.dat ), 来加
以介绍 .
A125 Jenny 100 210
A341 Dan 110 215
P158 Max 130 209
P148 John 125 220
A123 Linda 95 210
文件中各字段依次为 员工 ID, 姓名 , 薪资率 ,及 实际工时 . ID 中的第一码为部门识别码 .
"A","P" 分别表示 "组装 "及"包装 "部门 .
本小节着重于说明 awk 程序的主要架构及工作原理 , 并对一些重要的名词辅以必要的解释 .
由这部分内容 , 读者可体会出 awk 语言的主要精神及 awk 与其它语程序言的差异处 . 为便于
说明 , 以条列方式说明于后 .
名词定义
数据行 : awk 从数据文件上读取数据的基本单位 .以上列文件 emp.dat 为例 , awk 读入
的
第一笔数据行是 "A125 Jenny 100 210"
第二笔数据行是 "A341 Dan 110 215"
一般而言 , 一个 数据行 就相当于数据文件上的一行资料 . (参考 : 附录 B 内建变
量"RS" )
字段 (Field) : 为数据行上被分隔开的子字符串 .
以数据行 "A125 Jenny 100 210" 为例 ,
第一栏 第二栏 第三栏 第四栏 "A125" "Jenny" 100 210
一般是以空格符来分隔相邻的字段 . ( 参考 : 附录 D 内建变量 "FS" )
3. 如何执行 awk
3
于 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.
4
例如 : 若 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) 这些内建的字段变量 ?
当 awk 从数据文件中读取一个数据行时 , awk 会使用内建变量 $0 予以记录 .每当 $0 被改
动时 (例如 : 读入新的数据行 或 自行变更 $0,...) awk 会立刻重新分析 $0 的字段情况 ,
并将 $0 上各字段的数据用 $1, $2, ..予以记录 .
awk 的内建变量 (Built-in Variables)
awk 提供了许多内建变量 , 使用者于程序中可使用这些变量来取得相关信息 .常见的内建变
量有 :
内建变量
含义
NF (Number of Fields)
为一整数 , 其值表 $0 上所存在的字段数目 .
NR (Number of Records)
为一整数 , 其值表 awk 已读入的数据行数目 .
FILENAMEawk
正在处理的数据文件文件名 .
例如 : awk 从资料文件 emp.dat 中读入第一笔数据行
"A125 Jenny 100 210" 之后 , 程序中 :
$0 之值将是 "A125 Jenny 100 210"
$1 之值为 "A125"
$2 之值为 "Jenny"
$3 之值为 100
$4 之值为 210
$NF 之值为 4
5
$NR 之值为 1
$FILENAME 之值为 "emp.dat"
awk 的工作流程 :
执行 awk 时, 它会反复进行下列四步骤 .
1. 自动从指定的数据文件中读取一个数据行 .
2. 自动更新 (Update)相关的内建变量之值 . 如 : NF, NR, $0...
3. 依次执行程序中 所有 的 Pattern { Actions } 指令 .
4. 当执行完程序中所有 Pattern { Actions } 时, 若数据文件中还有未读取的数据 , 则
反复执行步骤 1 到步骤 4.
awk 会自动重复进行上述 4 个步骤 , 使用者不须于程序中编写这个循环 (Loop).
打印文件中指定的字段数据并加以计算
awk 处理数据时 , 它会自动从数据文件中一次读取一笔记录 , 并会
将该数据切分成一个个的字段 ; 程序中可使用 $1, $2,... 直接取得
各个字段的内容 . 这个特色让使用者易于用 awk 编写 reformatter 来改变量据格式 .
[ 范例 :] 以文件 emp.dat 为例 , 计算每人应发工资并打印报表 .
[ 分析 :] awk 会自行一次读入一列数据 , 故程序中仅需告诉
awk 如何处理所读入的数据行 .
执行如下命令 : ( $ 表 UNIX 命令行上的提示符 )
$ awk '{ print $2, $3 * $4 }' emp.dat
执行结果如下 :
屏幕出现 :
Jenny 21000
Dan 23650
Max 27170
John 27500
Linda 19950
[ 说明 :]
UNIX 命令行上 , 执行 awk 的语法为 :
$awk 'awk 程序 ' 欲处理的资料文件文件名
本范例中的 程序部分 为 {print $2, $3 * $4}.
把程序置于命令行时 , 程序之前后须以 ' 括住 .
emp.dat 为指定给该程序处理的数据文件文件名 .
本程序中使用 : Pattern { Actions } 语法.
Pattern 部分被省略 , 表无任何限制条件 . 故 awk 读入每笔数据行后都将无条件执行这个
Actions.
print 为 awk 所提供的输出指令 , 会将数据输出到 stdout(屏幕 ).
print 的参数间彼此以 "," (逗号 ) 隔开, 印出数据时彼此间会以空白隔开 . (参考 附录 D 内
建变量 OFS)
剩余47页未读,继续阅读
资源评论
csh18750931974
- 粉丝: 0
- 资源: 8万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功