logo资料库

The AWK Programming Language (中文版).pdf

第1页 / 共225页
第2页 / 共225页
第3页 / 共225页
第4页 / 共225页
第5页 / 共225页
第6页 / 共225页
第7页 / 共225页
第8页 / 共225页
资料共225页,剩余部分请下载后查看
封面
目录
前言
第一章 快速入门
1.1 开始
AWK 程序的结构
运行 AWK 程序
错误
1.2 简单的输出
打印每一行
打印某些字段
NF, 字段的数量
计算和打印
打印行号
将文本放入输出中
1.3 更精美的输出
字段排列
输出排序
1.4 选择
通过比较进行选择
通过计算进行选择
通过文本内容选择
模式的组合
数据验证
BEGIN与 END
1.5 用 AWK 计算
计数
计算总和与平均数
操作文本
字符串拼接
打印最后一行
内建函数
行, 单词与字符的计数
1.6 流程控制语句
If-Else 语句
While 语句
For 语句
1.7 数组
1.8 实用``一行''手册
1.9 接下来
第二章 Awk 语言
输入文件
程序格式
2.1 模式
BEGIN与 END
将表达式用作模式
字符串匹配 模式
正则表达式
复合模式
范围模式
模式总结
2.2 动作
表达式
流程控制语句
空语句
数组
2.3 用户自定义函数
2.4 输出
print语句
输出分隔符
printf 语句
输出到文件
输出到管道
关闭文件与管道
2.5 输入
输入分隔符
多行记录
getline 函数
命令行变量赋值
命令行参数
2.6 与其他程序的交互
system 函数
用 AWK 制作 Shell 命令
2.7 小结
第三章 数据处理
3.1 数据转换与归约
列求和
计算百分比与分位数
带逗号的数
字段固定的输入
程序的交叉引用检查
格式化的输出
3.2 数据验证
对称的分隔符
密码文件检查
自动生成数据验证程序
AWK 的版本
3.3 打包与拆包
3.4 多行记录
由空行分隔的记录
处理多行记录
带有头部和尾部的记录
名字-值
3.5 小结
第四章 报表与数据库
4.1 报表生成
一个简单的报表
更复杂的报表
4.2 打包的查询与报表
格式信函
4.3 关系数据库系统
自然连接
relfile
q, 类 awk 查询语言
qawk, q-to-awk 翻译器
4.4 小结
第五章 文本处理
5.1 生成随机文本
随机选择
废话生成器
随机语句
5.2 交互式的文本处理
技巧测试之运算
技巧测试之测验
5.3 文本处理
单词计数
文本格式化
维护手稿的交叉引用
制作 KWIC 索引
制作索引
5.4 小结
第六章 小型语言
6.1 汇编程序与解释程序
6.2 画图语言
6.3 sort 生成器
6.4 逆波兰式计算器
6.5 中缀计算器
6.6 递归下降语法分析
6.7 小结
第七章 算法实验
7.1 排序
插入排序
快速排序
堆排序
7.2 剖析
7.3 拓扑排序
广度优先拓扑排序
深度优先搜索
深度优先拓扑排序
7.4 Make: 文件更新程序
7.5 小结
第八章 后记
8.1 作为语言的 AWK
8.2 性能
8.3 结论
附录 A AWK 总结
附录 B 部分习题答案
索引
AWK 程序设计语言 Alfred V.Aho Brian W.Kernighan Peter J.Weinberger https://github.com/wuzhouhui/awk 2016 年 10 月 1 日
目录 前言 第一章 快速入门 1.1 开始 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AWK 程序的结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 运行 AWK 程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 简单的输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 打印每一行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 打印某些字段 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NF, 字段的数量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 计算和打印 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 打印行号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 将文本放入输出中 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 更精美的输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 字段排列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 输出排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4 选择 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 通过比较进行选择 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 通过计算进行选择 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 通过文本内容选择 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 模式的组合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 数据验证 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BEGIN 与 END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5 用 AWK 计算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 计数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 计算总和与平均数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 操作文本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 字符串拼接 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 打印最后一行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 内建函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 行, 单词与字符的计数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i v 1 1 2 3 4 4 5 5 5 5 6 6 6 7 7 8 8 8 8 9 10 10 10 11 11 11 12 12 12 13
目录 1.6 流程控制语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . If-Else 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . While 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . For 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.7 数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.8 实用 “一行” 手册 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.9 接下来 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 第二章 Awk 语言 2.1 模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BEGIN 与 END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 将表达式用作模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 字符串匹配模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 正则表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 复合模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 范围模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 模式总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 动作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 流程控制语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 空语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 用户自定义函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4 输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . print 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 输出分隔符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . printf 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 输出到文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 输出到管道 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 关闭文件与管道 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5 输入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 输入分隔符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 多行记录 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . getline 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 命令行变量赋值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 命令行参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6 与其他程序的交互 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . system 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 用 AWK 制作 Shell 命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.7 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ii 13 13 14 14 15 16 18 19 20 21 22 24 25 28 29 30 30 31 42 45 45 48 49 50 50 51 51 53 54 54 55 55 56 57 57 59 59 59 60
目录 第三章 数据处理 3.1 数据转换与归约 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 列求和 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 计算百分比与分位数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 带逗号的数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 字段固定的输入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 程序的交叉引用检查 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 格式化的输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 数据验证 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 对称的分隔符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 密码文件检查 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 自动生成数据验证程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AWK 的版本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 打包与拆包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4 多行记录 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 由空行分隔的记录 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 处理多行记录 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 带有头部和尾部的记录 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 名字-值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii 61 61 61 63 65 66 67 68 70 71 72 72 73 75 76 76 78 78 79 82 第四章 报表与数据库 83 4.1 报表生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 一个简单的报表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 更复杂的报表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 4.2 打包的查询与报表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 格式信函 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 4.3 关系数据库系统 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 自然连接 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 relfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 q, 类 awk 查询语言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 qawk, q-to-awk 翻译器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 4.4 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 第五章 文本处理 106 5.1 生成随机文本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 随机选择 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 废话生成器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 随机语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 5.2 交互式的文本处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 技巧测试之运算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
目录 iv 技巧测试之测验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 5.3 文本处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 单词计数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 文本格式化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 维护手稿的交叉引用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 制作 KWIC 索引 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 制作索引 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 5.4 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 第六章 小型语言 127 6.1 汇编程序与解释程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 6.2 画图语言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 6.3 sort 生成器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 6.4 逆波兰式计算器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 6.5 中缀计算器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 6.6 递归下降语法分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 6.7 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 第七章 算法实验 151 7.1 排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 插入排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 快速排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 堆排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 7.2 剖析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 7.3 拓扑排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 广度优先拓扑排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 深度优先搜索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 深度优先拓扑排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 7.4 Make: 文件更新程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 7.5 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 第八章 后记 177 8.1 作为语言的 AWK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 8.2 性能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 8.3 结论 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 附录 A AWK 总结 附录 B 部分习题答案 索引 182 190 205
前言 计算机用户经常把大量的时间花费在简单, 机械化的数据处理工作中 — 改变数据格式, 验证数据的 有效性, 搜索特定的数据项, 求和, 打印报表等. 这些工作完全可以自动化地完成, 但是如果每碰到一个这 样的任务, 就用一门标准的编程语言 (比如 C 或 Pascal) 写一个专用的程序来解决它, 未免也太麻烦了. Awk 是一门特殊的编程语言, 它可以非常方便处理上面提到的任务, 经常只需要一两行便可搞定. 一个 awk 程序由一系列的模式和动作组成, 这些模式与动作说明了在输入中搜索哪些数据, 以及当符合 条件的数据被找到时, 应该执行什么操作. Awk 在输入文件集合中搜索与模式相匹配的输入行, 当找到 一个匹配行时, 便会执行对应的动作. 通过字符串, 数值, 字段, 变量, 和数组元素的比较操作, 再加上正 则表达式, 利用这些组合, 一个模式可以用来选择输入行, 而动作可以对选中的行作任意的处理. 描述动 作的语言看起来和 C 非常像, 但是它不需要声明, 并且字符串和数值都是内建的数据类型. Awk 自动地搜索输入文件, 并把每一个输入行切分成字段. 因为许多工作都是自动完成的 — 包括 输入, 字段分割, 存储管理, 初始化 — 所以和传统语言编写的程序比起来, awk 程序会小得多. Awk 最 常用的用途就是前面提到的那些工作. 因为 awk 程序一般都很短, 所以人们经常这样使用它: 通过键盘 在命令行中输入程序代码 (只有一两行), 执行, 然后把代码丢弃. 实际上, awk 是一个通用编程工具, 许 多专用工具都可以用它来替代. 由于表达式和操作非常简便, 所以用 awk 来构造大型程序的原型就显得非常方便: 先从简单的几行 开始, 慢慢加以扩充, 测试不同的设计方案, 直到完成预期的目标. 因为程序比较简短, 所以很容易上手, 如果在开发的过程中想到了一个更好的方案, 修改起来 (甚至从头开始) 也没那么麻烦. 只要设计是正确 的, 那么把 awk 程序翻译成其他语言也很方便. iii iv 本书组织 本书的第一目标是告诉读者 awk 是什么, 以及如何高效地使用它. 第 一 章是一个快速入门教程, 读 过几页之后, 读者应该就有了足够的知识来开始写一些有用的 awk 程序. 这一章中的例子非常简短, 它 们都是 awk 的典型应用. 第 二 章对整个 awk 语言进行描述. 虽然这一章也包含了许多例子, 但是读起来就像手册一样枯燥, 所以在第一次阅读本章时, 快速浏览即可. 本书的剩下几章包含了相当丰富的例子, 这些例子主要用来展示 awk 的应用范围如何广泛, 以及如 何高效地使用它. 其中一些示例比较常规, 另外一些虽然展示了某些编程思想, 但并没有非常实际的用 途, 还有一小部分例子仅仅是因为它们比较有趣. 第 三 章的重点是检索, 转换, 归约和数据验证 — 这些任务本来就是当初开发 awk 的目标. 这一章 还讨论了如何处理多行记录, 比如地址薄. v
前言 vi Awk 是管理小型个人数据库的优秀工具. 第 四 章讨论如何从数据库中生成报表, 以及如何为存储 在多个文件中的数据, 构造一个简单的关系数据库系统和对应的查询语言. Awk 处理文本就像其他大多数语言处理数值一样方便, 所以它经常被应用在文本处理领域. 第 五 章讨论如何使用 awk 来生成文本, 以及协助文档的准备工作. 这一章包含了一个索引生成程序, 本书的 索引就是用它的增强版生成的. 第 六 章关于 “小型语言”, 小型语言指的是特定于某个领域的定制化语言. 使用 awk 编写翻译器非 常方便, 因为它的基本操作支持大部分的词汇和表格管理工作. 这一章包含汇编程序, 绘图程序, 和几个 计算器程序. Awk 还可以用来演示算法. 因为用 awk 写程序不需要声明, 也不用担心内存管理, 所以它不仅具有 伪代码的许多优点, 而且是可运行的. 第 七 讨论算法实验, 包括测试与性能评价. 算法包括几种排序算 法, 最后以 Unix 程序 make 作为结束. 第 八 章介绍 awk 的历史. 除此之外, 如果程序比较慢, 或者条件比较苛刻, 这一章还提出了几点建 议. 附录 A 总结了 awk 语言, 附录 B 是部分习题的参考答案. 读者应该从第 一 章开始阅读, 并尝试自己动手写程序. 快速浏览第 二 章, 重点关注汇总和表格, 不 要陷入到细节当中. 然后根据自己的兴趣, 阅读后面的章节, 这些章节之间都是互相独立的, 所以不用在 意阅读顺序. v 示例 示例覆盖了多个主题, 但其中最重要的是向读者展示如何高效地使用 awk. 我们已经努力让书中的 例子覆盖尽可能多的构造, 对关联数组和正则表达式有所侧重, 因为它们是 awk 编程的主要特点. 第 2 个主题是展示 awk 丰富的功能. 从数据库到芯片设计, 从数值分析到图形图像, 从编译器到系 统管理, 从非编程人员的第一门语言到软件工程课的实现语言 — 都可以见到 awk 的身影. 我们希望书 中的例子也能够让你有所启发. 第 3 个主题展示的是如何完成一些常见的计算操作. 相关的例子包括关系型数据库, 玩具计算机的 汇编程序和解释程序, 绘图语言, awk 子集的递归下降语法分析器, 基于 make 的文件更新程序等. 在每 个案例中, 都会有一个简短的程序, 向读者展示操作过程中最核心的部分, 以便快速理解和动手实践. 另外, 我们还会向读者说明解决编程问题的一系列方法. Awk 对快速原型开发方法支持得很好, 另 外一种不太明显的策略是分而治之 — 把一件大任务分成几个小任务, 每一个小任务集中解决问题的某 一方面. 最后一种方法是开发一个用来生成其他程序的程序. 通过开发小型语言, 我们可以更加容易地 定义出良好的用户接口, 以及更合理的实现方案. 虽然前面提到的方法是在 awk 的环境中提出, 但实际 上, 它们都是非常通用的编程方法, 每一位程序员都应该掌握. 书中所有的例子都是直接从文本中加以测试, 这些文本都是以机器可读的形式呈现. 我们已经尽力 让这些示例程序不含有有错误, 但是我们既没有为它们添加特性, 也没有用所有可能的无效数据对它们 进行测试: 这些程序的目标主要是用来说明问题.
前言 vii AWK 的演变 Awk 最早由本书作者在 1977 年设计并实现, 当时是作为实验的一部分, 而这个实验是为了检查 Unix 工具 grep 和 sed 是否可以像处理文本那样处理数值. Awk 的开发基于我们对正则表达式和可 编程编辑器的兴趣. 虽然开发 awk 是为了写出非常简短的程序, 但是它丰富的功能马上吸引了众多的用 户, 而这些用户经常开发大型程序, 这些大型程序需要 awk 提交更多的功能, 因此在 1985 年, awk 推出 了一个增加版. 增强版增加的一个主要特性是允许用户定义自己的函数. 其他的增强功能包括动态正则表达式 — vi 带有文本替换和模式匹配功能; 更丰富的内建函数与变量; 新增的运算符和语句; 从多个文件中读取输入 数据; 命令行参数的支持. 出错时的消息提示也得到了加强. 第 一 章的例子只使用了原版 awk 的功能, 而后面的例子则用到了许多新增的特性. 本书的 awk 版本是 Unix System V Release 3.1 的一部分, 其源代码可以通过 AT&T 的 Unix System Toolchest 软件发行系统得到, 请拨打 1-201-522-6900, 并以访客身份登录; 如果是欧洲地区, 请联系位于伦敦的 AT&T Unix Europe (44-1-567-7711); 如果是远东地区, 请联系位于东京的 AT&T Unix Pacific (81-3-431-3670). 因为 awk 在 Unix 系统中开发而成, 所以它的某些功能只能在 Unix 系统使用, 有几个例子使用了 这些和操作系统相关的功能. 另外, 我们还假设系统中提供了某些 Unix 实用工具, 尤其是 sort. ‹ 除 了这些限制条件, awk 应该能在多种平台中使用, 尤其是它也能在 MS-DOS 中运行. 更多的信息请咨询 Addison-Wesley. Awk 并不完美, 它也有一些例外, 遗漏, 或者仅仅是一些不好的设计导致的, 有时候它还会很慢. 但 它同时也是一门功能丰富的语言, 可以解决许多编程问题, 希望读者能像我们一样, 从 awk 中得到巨大 的帮助. 致谢 本书的写作过程得到了许多人的帮助, 我们由衷地感谢他们, 尤其是 Jon Bentley, 他的热情始 终鼓舞着我们. Jon 为本书的创作提供了许多想法和程序, 这些都来源于他长期使用和教授 awk 积 累下来的经验, 他还认真地阅读了本书的部分草稿. 另外, 我们还要感谢 Doug McIlroy, 作为一名 出色的读者, 他帮助我们改善了整本书的结构和内容. 其他人还包括 Susan Aho, Jaap Akkerhuis, Lorinda Cherry, Chris Fraser, Eric Grosse, Riccardo Gusella, Bob Herbst, Mark Kernighan, John Linderman, Bob Martin, Howard Moscovitz, Gerard Schmitt, Don Swartwout, Howard Trickey, Peter van Eijk, Chris Van Wyk, and Mihalis Yannakakis, 谢谢他们的帮助. Alfred V. Aho Brian W. Kernighan Peter J. Weinberger ‹原文是 Furthermore, we have assumed the existence of some Unix utilities, particularly sort, for which exact equivalents may not exist elsewhere.
分享到:
收藏