《awk 命令详解教程》由会员分享,可在线阅读,更多相关《awk 命令详解教程(50页珍藏版)》请在金锄头文库上搜索。
1、awk 手册 简体中文版由 bones7456 (http:/)整理.原文:应该是 http:/phi.sinica.edu.tw/aspac/reports/94/94011/ 但是原文很乱.说明:之前也是对 awk 几乎一无所知,无意中看到这篇文章 ,网上一搜,居然没有像样的简体中文版 .有的也是不怎么完整,或者错误一大堆的.于是就顺手整理了下这篇文章.通过整理这篇文章,自己也渐渐掌握了 awk 的种种用法.原文可能比较老,有些目前已经不适用的命令有所改动,文中所有命令均在 ubuntu7.04 下调试通过,用的 awk 是 mawk.由于本人能力有限,错误和不妥之处在所难免,欢迎多多指正
2、.last update: 2010-04-161. 前言 有关本手册 : 这是一本 awk 学习指引, 其重点着重于 : awk 适于解决哪些问题 ? awk 常见的解题模式为何 ? 为使读者快速掌握 awk 解题的模式及特性, 本手册系由一些较具代表性的范例及其题解所构成; 各范例由浅入深, 彼此间相互连贯 ,范例中并对所使用的 awk语法及指令辅以必要的说明. 有关 awk 的指令, 函数,.等条列式的说明则收录于附录中, 以利读者往后撰写程序时查阅. 如此编排, 可让读者在短时间内顺畅地学会使用 awk 来解决问题. 建议读者循着范例上机实习, 以加深学习效果. 读者宜先具备下列背景
3、: a. UNIX 环境下的简单操作及基本概念. 例如 : 文件编辑, 文件复制 及 管道, 输入/输出重定向 等概念 b. C 语言的基本语法及流程控制指令. (awk 指令并不多, 且其中之大部分与 C 语言中之用法一致, 本手册中对该类指令之语法及特性不再加以繁冗的说明, 读者若欲深究,可自行翻阅相关的 C 语言书籍) 2. awk 概述 为什么使用 awk awk 是一种程序语言 . 它具有一般程序语言常见的功能. 因 awk 语言具有某些特点, 如 : 使用直译器(Interpreter)不需先行编译; 变量无类型之分(Typeless), 可使用文字当数组的下标 (Associat
4、ive Array).等特色. 因此, 使用 awk 撰写程序比起使用其它语言更简洁便利且节省时间. awk 还具有一些内建功能, 使得 awk 擅于处理具数据行(Record), 字段(Field)型态的资料; 此外, awk 内建有 pipe 的功能, 可将处理中的数据传送给外部的 Shell 命令加以处理, 再将 Shell 命令处理后的数据传回 awk 程序, 这个特点也使得 awk 程序很容易使用系统资源. 由于 awk 具有上述特色 , 在问题处理的过程中, 可轻易使用 awk 来撰写一些小工具; 这些小工具并非用来解决整个大问题,它们只扮演解决个别问题过程的某些角色, 可藉由 S
5、hell 所提供的 pipe 将数据按需要传送给不同的小工具进行处理, 以解决整个大问题. 这种解题方式, 使得这些小工具可因不同需求而被重复组合及重用(reuse); 也可藉此方式来先行测试大程序原型的可行性与正确性, 将来若需要较高的执行速度时再用 C 语言来改写.这是 awk 最常被应用之处. 若能常常如此处理问题, 读者可以以更高的角度来思考抽象的问题, 而不会被拘泥于细节的部份. 本手册为 awk 入门的学习指引, 其内容将先强调如何撰写 awk 程序,未列入进一步解题方式的应用实例, 这部分将留待 UNIX 进阶手册中再行讨论 . 如何取得 awk 一般的 UNIX 操作系统, 本
6、身即附有 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 12
7、5 220 A123 Linda 95 210 文件中各字段依次为 员工 ID, 姓名, 薪资率,及 实际工时. ID 中的第一码为部门识别码. A,P分别表示 组装及 包装部门. 本小节着重于说明 awk 程序的主要架构及工作原理, 并对一些重要的名词辅以必要的解释. 由这部分内容, 读者可体会出 awk 语言的主要精神及 awk 与其它语程序言的差异处. 为便于说明, 以条列方式说明于后. 名词定义 数据行: awk 从数据文件上读取数据的基本单位 .以上列文件 emp.dat 为例, awk 读入的 第一笔数据行是 A125 Jenny 100 210 第二笔数据行是 A341 Dan
8、110 215 一般而言, 一个 数据行 就相当于数据文件上的一行资料. (参考 : 附录 B 内建变量 RS ) 字段(Field) : 为数据行上被分隔开的子字符串. 以数据行A125 Jenny 100 210为例, 第一栏 第二栏 第三栏 第四栏 A125 Jenny 100 210 一般是以空格符来分隔相邻的字段. ( 参考 : 附录 D 内建变量FS ) 3. 如何执行 awk 于 UNIX 的命令行上键入诸如下列格式的指令: ( $表 Shell 命令行上的提示符号) $awk awk 程序 数据文件文件名 则 awk 会先编译该程序 , 然后执行该程序来处理所指定的数据文件.
9、(上列方式系直接把程序写在 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
10、 与变量 y 是否存在等于的关系. 上式中 x 34 , x = y 便是典型的 Pattern. awk 提供 C 语言中常见的关系运算符(Relational Operators) 如 , =, 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,
11、 故 awk 将不会印出 Good morning ! awk 如何处理 Actions 的语法?(缺少 Pattern 部分) 有时语法 Pattern Actions 中, Pattern 部分被省略 ,只剩 Actions.这种情形表示 无条件执行这个 Actions. awk 的字段变量 awk 所内建的字段变量及其涵意如下 : 字段变量 含义$0 一字符串, 其内容为目前 awk 所读入的数据行.$1 $0 上第一个字段的数据.$2 $0 上第二个字段的数据. 其余类推读入数据行时, awk 如何更新(update)这些内建的字段变量? 当 awk 从数据文件中读取一个数据行时, a
12、wk 会使用内建变量$0 予以记录.每当 $0 被改动时 (例如 : 读入新的数据行 或 自行变更 $0,.) awk 会立刻重新分析 $0 的字段情况, 并将 $0 上各字段的数据用 $1, $2, .予以记录. awk 的内建变量(Built-in Variables) awk 提供了许多内建变量, 使用者于程序中可使用这些变量来取得相关信息.常见的内建变量有 : 内建变量 含义NF (Number of Fields) 为一整数, 其值表$0 上所存在的字段数目.NR (Number of Records)为一整数, 其值表 awk 已读入的数据行数目.FILENAMEawk 正在处理的
13、数据文件文件名. 例如 : awk 从资料文件 emp.dat 中读入第一笔数据行 A125 Jenny 100 210 之后 , 程序中: $0 之值将是 A125 Jenny 100 210 $1 之值为 A125 $2 之值为 Jenny $3 之值为 100 $4 之值为 210 $NF 之值为 4 $NR 之值为 1 $FILENAME 之值为 emp.dat awk 的工作流程 : 执行 awk 时, 它会反复进行下列四步骤. 1. 自动从指定的数据文件中读取一个数据行. 2. 自动更新(Update) 相关的内建变量之值 . 如 : NF, NR, $0. 3. 依次执行程序中
14、所有 的 Pattern Actions 指令. 4. 当执行完程序中所有 Pattern Actions 时, 若数据文件中还有未读取的数据, 则反复执行步骤 1 到步骤 4. awk 会自动重复进行上述 4 个步骤, 使用者不须于程序中编写这个循环 (Loop). 打印文件中指定的字段数据并加以计算 awk 处理数据时 , 它会自动从数据文件中一次读取一笔记录, 并会 将该数据切分成一个个的字段; 程序中可使用 $1, $2,. 直接取得 各个字段的内容. 这个特色让使用者易于用 awk 编写 reformatter 来改变量据格式. 范例 : 以文件 emp.dat 为例, 计算每人应发
15、工资并打印报表. 分析 : 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) 将上述的 程序部分 储存于文件 pay1.awk 中. 执行命令时再指定 aw