分类:
2005-07-05 20:48:25
引用: |
内容有: • 抽取域。 • 匹配正则表达式。 • 比较域。 • 向a w k传递参数。 • 基本的a w k行操作和脚本。 |
下面没有讲述a w k的全部特性,也不涉及a w k的深层次编程,仅讲述使用a w k执行行操作及怎样从文本文件和字符串中抽取信息。
引用: |
内容有: • 抽取域。 • 匹配正则表达式。 • 比较域。 • 向a w k传递参数。 • 基本的a w k行操作和脚本。 |
代码: |
awk [-F fild-separator] 'commands' input-file(s) |
代码: |
awk -F: 'commands' input-file(s) |
代码: |
awk -f awk-script-file input-files(s) |
引用: |
域1 分隔符 域2 分隔符 域3 分隔符 域4及换行 P. B u n n y (记录1 ) # 0 2 / 9 9 # 4 8 # Yellow J . Tr o l l (记录2 ) # 0 7 / 9 9 # 4 8 4 2 # Brown-3 |
2.1 模式和动作
任何a w k语句都由模式和动作组成。在一个a w k脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保持执行状态。
模式可以是任何条件语句或复合语句或正则表达式。模式包括两个特殊字段B E G I N和E N D。使用B E G I N语句设置计数和打印头。B E G I N语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行。E N D语句用来在a w k完成文本浏览动作后打印输出文本总数和结尾状态标志。如果不特别指明模式, a w k总是匹配或打印行数。
实际动作在大括号{ }内指明。动作大多数用来打印,但是还有些更长的代码诸如i f和循环(l o o p i n g)语句及循环退出结构。如果不指明采取动作, a w k将打印出所有浏览出来的记录。
2. 域和记录
a w k执行时,其浏览域标记为$ 1,$ 2 . . . $ n。这种方法称为域标识。使用这些域标识将更容易对域进行进一步处理。
使用$ 1 , $ 3表示参照第1和第3域,注意这里用逗号做域分隔。如果希望打印一个有5个域的记录的所有域,不必指明$ 1 , $ 2 , $ 3 , $ 4 , $ 5,可使用$ 0,意即所有域。Aw k浏览时,到达一新行,即假定到达包含域的记录末尾,然后执行新记录下一行的读动作,并重新设置域分隔。
注意执行时不要混淆符号$和s h e l l提示符$,它们是不同的。
为打印一个域或所有域,使用p r i n t命令。这是一个a w k动作(动作语法用圆括号括起来)。
1. 抽取域
真正执行前看几个例子,现有一文本文件g r a d e . t x t,记录了一个称为柔道数据库的行信息。
代码: |
$ cat grade.txt M.Tans 5/99 48311 Green 8 40 44 J.Lulu 06/99 48317 green 9 24 26 P.Bunny 02/99 48 Yellow 12 35 28 J.Troll 07/99 4842 Brown-3 12 26 26 L.Tansl 05/99 4712 Brown-2 12 30 28 |
代码: |
$ awk '{print $0}' grade.txt >wow $ cat grade.txt |
代码: |
$ awk '{print $0}' grade.txt | tee delete_me_and_die |
引用: |
belts.awk grade_student.txt 也可替代使用下述格式: 使用重定向方法: belts.awk < grade2.txt 或管道方法: grade2.txt | belts.awk |
代码: |
$ awk '{print $0}' grade.txt |
代码: |
$ awk '{print $1,$4}' grade.txt M.Tans Green J.Lulu green P.Bunny Yellow J.Troll Brown-3 L.Tansl Brown-2 |
代码: |
$ awk 'BEGIN {print "Name Belt
-----------------------------------"}{print $1" ",$4}' grade.txt Name Belt ----------------------------------- M.Tans Green J.Lulu green P.Bunny Yellow J.Troll Brown-3 L.Tansl Brown-2 |
代码: |
$ awk 'BEGIN {print "Name
--------"}{print $1} END {"end-of-report"}' grade.txt Name -------- M.Tans J.Lulu P.Bunny J.Troll L.Tansl |
代码: |
$ awk 'BEGIN {print "Name
--------}{print $1} END {"end-of-report"}' grade.txt awk: cmd. line:1: BEGIN {print "Name --------}{print $1} END {"end-of-report"} awk: cmd. line:1: ^ unterminated string |
引用: |
• 确保整个a w k命令用单引号括起来。 • 确保命令内所有引号成对出现。 • 确保用花括号括起动作语句,用圆括号括起条件语句。 • 可能忘记使用花括号,也许你认为没有必要,但a w k不这样认为,将按之解释语法 |
代码: |
$ awk 'END {print NR}' grades.txt awk: cmd. line:2: fatal: cannot open file `grades.txt' for reading (没有那个文件或目录) |
代码: |
$ awk 'BEGIN {print "Name
--------"}{print $1} END {"end-of-report"}' Name -------- |
代码: |
^ $ . [] | () * + ? |
引用: |
+ 使用+匹配一个或多个字符。 ? 匹配模式出现频率。例如使用/X Y?Z/匹配X Y Z或Y Z。 |