您的位置:首页 > 运维架构 > Shell

Shell 脚本学习之awk

2012-12-29 10:12 405 查看
awk逐行扫描文件(或输入),查找匹配某个特殊模式的文本行,并对这些文本行执行指定动作。

awk代表该语言的3位作者。awk程序的组成部分:awk命令,括在引号(或写在文件)中的程序指令以及输入文件的文件名。如果没有指定输入文件,输入则来自标准输入(stdin),即键盘。awk指令由模式、操作或模式与操作的组合而成。模式是由正则表达式/判别条件真伪的表达式组成的语句,它不能被括在花括号中。模式表达式中暗含着if语句。操作由括在花括号内的一条或多条语句组成,语句之间用分号或者换行符分割。

awk的几种版本介绍参见:http://www.cnblogs.com/zhangrui/archive/2012/03/06/2381484.html

awk要处理的文本行来自文件、管道或标准输入。

----------------------------------------------------------------------------------------------------------------------------------

格式化输出:像C 语言一样,可以使用printf函数,用法一样;简单的格式输出可以使用print函数。print函数的一个例子如下:



注意不同版本的linux下date命令输出不太一样,print输出操作部分,用花括号括起来,字符串用双引号引起来,\n是换行符,参数之间用逗号分开(逗号被解释为空格),如果没有逗号,所有的参数就会被串在一起。

printf的用法如下所示,可以看出,可以有更多的格式控制功能:



printf后带上小括号,用法就跟C语言一样了,挺简单的。

----------------------------------------------------------------------------------------------------------------------------------------

记录与字段

记录(record):默认记录下,每一行被称为一条记录,以换行符终止。awk认为数据具有格式和结构,而不是无休止的字符串。

缺省情况下,输入和输出的记录分隔符(行分隔符)都是回车符,记录分隔符保存在内置变量中,可以修改,但只能以有限的方式修改。

变量$0指代整条记录。NR(number of record)表示记录号,从1开始,注释也算一条记录,如下所示:



注意:employees文件需要自己创建,然后变量之间要使用逗号分割开,而不能使用空格。

字段(field):每条记录都是由词组成的,这些词就被成为字段。默认情况下,字段之间的分隔符是空白符(空格或制表符)。

每条记录都是从第一个字段($1表示)开始,然后是第二个字段($2),以此类推。

变量NF(number of filed)来保存记录的字段数。如下所示:



可以看出文件中每条记录的字段值都是5,每条记录的字段数当然可以不同。

字段的分隔符是可以改变的,可以在BEGIN语句或在命令行下赋值来改变。

awk -F: '\Tom Jones/{print $1,$2}' employees
上面的命令将输入分隔符改为冒号。当然也可以设置多个分隔符。

----------------------------------------------------------------------------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: