最近接触了linux的使用和一些命令、工具的使用,awk恐怕是linux用处最广的工具之一了,今天开始,我打算记录下我的学习过程。 一.awk的简介 与sed和grep很相似,awk是一种样式扫描与处理工具,其功能远远强于sed和grep,除了几乎所有的sed和grep功能之外,awk还可以进行样式装入,流控制,数学运算符,进程控制语句,甚至内置的变量和函数。它具备了一个完整的语言所应具备的特性,实际上awk确实拥有自己的语言,awk程序设计语言,awk的三位创建者已将其定义为:awk样式扫描和处理语言。 基于文本的样式扫描和处理是我们经常要做的工作,比如从一个上千行的具有一定格式的文本文件中找出满足要求的行并输出到一个新文本,就可以使用awk。再比如,监控网络时,由于网络上流动的数据非常多,如果需要获得某些特定的数据,使用awk过滤。简而言之,awk就是一个强大的文本处理工具。 在这里有一个可遵循的一般原则:如果你用普通的shell工具或shell script有困难的话,试试awk,如果awk仍不能解决问题,则便用C语言,如果C语言仍然失败,则移至C++。 二.awk的调用方式 1.awk命令行的方式,适用于解决简单问题,例如:打印testfile文本中第一列为abc的所有行(省略了print)
2.使用-f选项调用awk程序文件,例如:将一段awk程序保存到文本,名为testawk1,在命令行中执行该文件
3.利用命令解释器调用awk,例如:将一段awk程序保存至文本,名为myawk,与前面不同的是该文本首行需要添加:#!/bin/awk -f ,保存后赋予该文件执行权限,命令行中直接调用:
三.awk语法 awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...] -F re: 允许awk更改其字段分隔符。 parameter: 'prog': awk程序语句段,必须使用单引号‘’引起来,防止被shell解释。 其标准形式为'pattern{action}'。前面第二节中的第一小节举例:awk '$1==abc' testfile其中'$1==abc'就是pattern,起过滤作用,即:只有符合$1==abc的行,才执行执行{action}操作。但此例中省略了{action},此时将默认执行print操作,即打印到标准输出。 pattern和{action}二者可以省略其中之一,但是不能两者同时省略。pattern省略时表示不对任何行进行过滤。 {action}中的语句之间,使用;进行分隔,使用#进行注释。 -f progfile: 允许awk调用并执行progfile文件。progfile必须是一个符合awk语法的文本文件。 in_file: awk的输入文件。awk允许对多个输入文件进行处理,其间用,隔开,awk不会修改输入文件。如果未指定输入文件,awk将接受标准输入,并将结果显示在标准输出。awk支持输入输出重定向。 四.记录、字段和内置变量 记录和字段:在awk中,缺省情况下会将文本中的一行视为一个记录,而将一行中的某一部分视作一个字段,这与数据库中对数据的处理方式类似。比如数据库中某个数据表的第一个字段名叫做ID,第二个叫做Name,在awk中使用$1、$2表示第一个字段、第二个字段。特殊的,awk用$0来表示整个行(整条记录)。 分隔符:不同的字段之间是用称作分隔符的字符分隔开的。系统默认的分隔符是空格。awk允许在命令行中用-F re的形式来改变这个分隔符。事实上,awk用一个内置的变量FS来记忆这个分隔符。 内置变量:除了FS外,awk中有好几个这样的内置变量,如记录和记录之间(行与行之间)的分隔符使用RS表示,当前工作的记录数为NR等等。这些内置的变量可以在awk程序中引用或修改,例如,可以利用NR变量在模式匹配中指定工作范围,也可以通过修改记录分隔符RS让一个特殊字符而不是换行符作为记录的分隔符。例如,以下语句表示,显示文本文件第7行到第15行中以%分给的第1、3、7个字段值。
awk的其他内置变量:A=awk,N=nawk,P=POSIX awk。以下内置变量以系统中的帮助为准(不同系统下的awk可能有所出入)。
五.内置函数 例:显示文件myfile中的行号和第3字段: 其中,printf即内部函数,该函数类似c++中的printf,可以对输出格式进行控制; 例:下面的示例显示了内置变量和内置函数length()的使用: 其他内置函数:(以自己系统中的帮助为准) N gsub(reg,string,target) 每次常规表达式reg匹配时替换target中的string 六.awk的自定义变量 awk允许用户在awk程序语句中定义并调用自已的变量。当然这种变量不能与内置变量及其它awk保留字相同。与C语言不同的是,awk中不需要对变量进行初始化,awk根据其在awk中第一次出现的形式和上下文确定其具体的数据类型。当变量类型不确定时,awk默认其为字符串类型。这里有一个技巧:如果你要让你的awk程序知道你所使用的变量的明确类型,你应当在在程序中给它赋初值。 举例: awk '[name=$1;pwd=$2;print $1,$2]' user.log 说明:上例中的name、pwd均为自定义变量,不需初始化,非常简便. |
|