awk

本来参考资源:

<<Shell 脚本学习指南>>


1. awk命令行

短程序通常是直接在命令行上提供,而比较长的程序,则委托-f选项指定。

--是特殊选项,指出awk本身已没有更进一步的命令行选项。任何接下来的选项都可被程序使用。

-F选项是用来重新定义默认字段分隔字符,且一般惯例将它作为第一个命令行选项。

fs参数是一个正则表达式,或是被提供作为下一个参数,字段分隔字符也可设置使用内建变量FS所指定的。




2. awk程序模型

awk把输入流--------------> 一连串记录的集合-------------->  每条记录可细分为字段【记录和字段,可指定】


awk程序:

pattern {action}


pattern多半是数字或字符串表达式,但awk以保留字BEGIN与END提供两种特殊模式

与BEGIN关联的操作只会执行一次,在任何命令文件或一般命令行赋值被处理之前,但是在任何开头的-v选项指定已完成之后。它大部分用来处理程序所需要的任何特殊初始化工作。

END操作也只执行一次,用于所有输入数据已被处理完之后,它多半用于产生要报告,或是执行清除操作。

BEGIN与END模式可任意顺序,可存在于awk程序内的任何位置。通常,以BEGIN模式放在程序的第一个位置,将END模式放在最后。当指定多个BEGIN或END模式,则它们将按照在awk程序里面的顺序,一次执行。


3. 程序元素

标量(scalar)与数组(array)两种变量以保存数据、数字与字符串表达式

注释以#开始直到该行结束,跟Shell类似,空行等同于空的注释

(1)字符串与字符串表达式

awk字符串包含零到多个字符,且在字符串的长度上没有限制,可视可用内存而定;字符串表达式赋值给变量后,会自动建立一个字符串,且变量的前一个字符串所占用的内在也会自动回收。

字符串的比较,用的是传统的关系运算符。【==, !=,<,<= and so on】
awk无特殊的字符串连续运算符,即两个连续字符串,会自动地连接在一起。


(2)数字与数值表达式

awk里的数字,都以双精度的浮点值表示。


(3)标量变量

保存单一值的变量叫标量变量,awk中无须声明,命名规则同C语言类似



(4)数组变量

awk允许以任意数字或字符串表达式括起来作为数组下标【索引】------>关联数组

当元素不需要时,其存储空间可回收再利用。
delete array[index]会从数组中删除元素
delete array则是删除所有的元素





(5)命令行参数

awk通过内建变量ARGC(参数计数)与ARGV(参数向量,或参数值),让命令行参数可用。






(6)环境变量



内建数组ENVIRON数组并无特别之处,可依需要来加入、删除及修改项目。



4. 记录与字段 

(1)记录分隔字符(RS)

gawk与mawk提供了一个重要的扩展功能,RS可以是正则表达式,即提供比单一字符还长的长度
使用正则表达式记录分隔字符时,匹配分隔字符的文本不再是由RS值来决定的,gawk以内建变量RT中的语言扩展来提供此功能,mawk则不支持。

若没有RS的正则表达式扩展,遇到情况是比较困难的。有时可使用tr将换行符号转为其他未用到的字符,让流串成极长的一行,但会受到其他工具程序里缓冲区大小限制的冲突。

(2)字段分隔字符(FS) 

字段彼此是被匹配字段分隔字符正则表达式的当前字符串值分隔。

FS的默认值为单一空格(space),它接受特殊的解释方式,一个或多个空白字符(空格与制表字符)及行的开头与结尾的空白,都将被忽略。



(3)字段



5. 模式与操作

(1)模式




(2)操作






6. 语句

(1)连续执行

连续的执行是以一个语句一行或以分号隔开的方式,提供一连串语句列表。

(2)条件式执行


(3)重复执行




(4)其他流程控制语句

break

continue


只针对此记录略过更进一步的模式检查:next语句

针对当前输入文件略过更进一步的模式检查:nextfile语句

略过整个工作的更进一步执行,并返回状态码给Shell:使用exit n语句


(5)用户控制的输入

awk直接处理命令行上标明的输入文件,意指绝大多数的awk程序都不必自己打开与处理文件。它也可以通过awk的getline语句来实现。



(6) 执行外部程序 



7. 字符串函数

length(string):求string的长度

子字符串提取:substr(string, start, len)

字母大小写转换:tolower(string),toupper(string)

字符串查找:index(string, find)【返回string中第一次出现find的位置】;rindex(string, find)【返回string中find最后一次出现的位置】

字符串匹配:match(string, regexp)【将string与正则表达式regexp匹配,若匹配,则返回匹配string的索引;不匹配,则返回0;提供对比表达式(string ~ regexp)更多的信息】

字符串替换:sub(regexp, replacement, target)将target与正则表达式regexp进行匹配,将最左边最长的匹配部分替换为字符口中 replacement。

                    gsub(regexp, replacement, traget)与sub类似,但它会替换所有匹配的字符串。

字符串分割:split(string, array,regexp)将string切割为片段,并存储到array里的连续元素。在数组中,片段放置在匹配正则表达式regexp的子字符串之间。若regexp省略,则使用内建字段分隔符FS的当前默认值。函数会返回array里的元素数量。【字段分隔字符值" "与”[ ]“:前者 会忽略前置与结尾的空白,并于运行时将空白视为一个单独空格,后者则正好匹配一上空格。】

字符串格式化:sprintf(format,expression1,expression2,........)


8. 数值函数























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值