awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。
awk命令语法格式:
awk?[options]?‘scripts‘?filename
awk?[options]?‘pattern?{action}‘?filename
options是awk的支持的选项,譬如-F -v等; scripts是其处理脚本,包含模式pattern和动作action(模式和动作的关系一般为,模式负责确定有效字段,动作负责对其处理) .
常用选项:
-F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
-v var=value 赋值一个用户定义变量,将外部变量传递给awk
-f scripfile 从脚本文件中读取awk命令
-m[fr] val 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
实例:
1、截取文档中的某个段:
-F 选项的作用是指定分隔符,如果不加-F指定,则以空格或者tab为分隔符。 Print为打印的动作,用来打印出某个字段。$1为第一个字段,$2为第二个字段,依次类推,有一个特殊的那就是$0,它表示整行。
注意awk的格式,-F后紧跟单引号,然后里面为分隔符,print的动作要用 { } 括起来,否则会报错。print还可以打印自定义的内容,但是自定义的内容要用双引号括起来。
2、匹配字符或者字符串:
这个跟sed用法类似,但是没有颜色显示,这点肯定没有sed用起来方便。但是awk有比sed更强大的匹配功能。
上面这个例子,是让第一段去匹配字符‘o’,‘~’是匹配的意思。
awk命令还可以多次匹配:
3、条件操作符:
awk中是可以用逻辑符号判断的,比如 ‘==’ 就是等于,也可以理解为 ‘精确匹配’ 另外也有 >, ‘>=, ‘<, ‘<=, ‘!= 等等,值得注意的是,在和数字比较时,若把比较的数字用双引号引起来后,那么awk不会认为是数字,而认为是字符,不加双引号则认为是数字。
在上面的例子中,本想把uid大于等于500的行打印出,但是结果并不是我们的预期,这是因为awk把所有的数字当作字符来对待了,就跟之前提到的 sort 排序原理一样。
!= 为不匹配,除了针对某一个段的字符进行逻辑比较外,还可以两个段之间进行逻辑比较:
另外还可以使用 && 和 || 表示 “并且” 和 “或者” 的意思:
4、awk的内置变量,awk常用的变量有:OSF、NF和NR。OFS与-F选项功能类似,用阿里定义分隔符,但是它是用在输出时定义。NF表示用分隔符分隔后一共多少行,NR表示行号。
1)OFS用法实例:
高级点的用法:
2)NF的用法:
NF 是多少段,而$NF是最后一段的值。
3)NR的用法:
我们可以使用NR作为判断条件:
还可以配合段匹配一起使用:
5、awk中的数学运算:
1)awk更改段值:
2)对各个段的值进行运算:
3)计算某个段的总和:
这里的END要注意一下,表示所有的行都已经执行,这是awk特有的语法,其实awk连同sed都可以写成一个脚本文件,而且有他们特有的语法,在awk中使用if判断、for循环都是可以的。
原文地址:http://blog.51cto.com/3069201/2062236