awk文本处理工具原理及使用:
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势 。也最复杂!
常用命令选项:
-F | 指定输入分隔符,可以是字符串或正则表达式,如-F: |
---|---|
-v | var=value 赋值一个用户定义变量,将外部变量传递给awk(每定义一个变量一个参数-v) |
-f | scriptfile 从脚本文件中读取awk命令 |
-v | OFS=”\t” OFS变量表示输出分隔符(每定义一个变量一个参数-v |
模式和操作:
awk脚本是由模式和操作来组成的
- 模式可以是以下任意一个:
1./正则表达式/: 使用通配符的扩展集,在”/” “/”这两根斜线之间的是正则表达式
2.关系表达式: 使用运算符进行操作,可以是字符串或数字的比较测试
3.模式匹配表达式: 用运算符(匹配)和!(不匹配)
4.BEGIN语句块、pattern语句块、END语句块 - 操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是 :
1.变量或数组赋值
2.输出命令
3.内置函数
4.控制流语句
基本结构:
awk ‘BEGIN{ print “start” } pattern{ commands } END{ print “end” }’ file
一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被单引号或双引号中.
awk ‘BEGIN{ i=0 } { i++ } END{ print i }’ filename awk “BEGIN{ i=0 } {
i++ } END{ print i }” filename
内置变量:
[A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk
$n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。
$0 这个变量包含执行过程中当前行的文本内容。
[N] ARGC 命令行参数的数目。
[G] ARGIND 命令行中当前文件的位置(从1开始算)。
[N] ARGV 包含命令行参数的数组。
[G] CONVFMT 数字转换格式(默认值为%.6g)。
[P] ENVIRON 环境变量关联数组。
[N] ERRNO 最后一个系统错误的描述。
[G] FIELDWIDTHS 字段宽度列表(用空格键分隔)。
[A] FILENAME 当前输入文件的名。
[P] FNR 同NR,但相对于当前文件。
[A] FS 字段分隔符(默认是任何空格)。
[G] IGNORECASE 如果为真,则进行忽略大小写的匹配。
[A] NF 表示字段数,在执行过程中对应于当前的字段数。
[A] NR 表示记录数,在执行过程中对应于当前的行号。
[A] OFMT 数字的输出格式(默认值是%.6g)。
[A] OFS 输出字段分隔符(默认值是一个空格)。
[A] ORS 输出记录分隔符(默认值是一个换行符)。
[A] RS 记录分隔符(默认是一个换行符)。
[N] RSTART 由match函数所匹配的字符串的第一个位置。
[N] RLENGTH 由match函数所匹配的字符串的长度。
[N] SUBSEP 数组下标分隔符(默认值是34)
测试:
1、内置变量
- 打印出一行中的最后一个字段;及倒数第二个字段$(NF-1)
- 总字段数,也可组合使用
- 指定列
- 统计文件中的行数:
下面命令只用了END语句块,在读入每一行的时,awk会将NR更新为对应的行号,当到达最后一行NR的值就是最后一行的行号,所以END语句块中的NR就是文件的行数
- 一个每一行中第一个字段值累加
例如:从1加到100
- 外部变量传递
-v选项,可以将外部值(并非来自stdin)传递给awk
变量之间用空格分隔作为awk的命令行参数跟随在BEGIN、{}和END语句块之后
shell全局变量传递给awk - awk运算与判断
+ - 加、减
* / & 乘、除、求余
+ - ! 一元加、减、逻辑非
^ ** 求幂
++ – 增加或减少,作为前缀或后缀
1.赋值运算符(= += -= *= /= %= ^= **= )
2.逻辑运算符(|| 逻辑或 && 逻辑与)
3.关系运算符(< <= > >= != == )
4.正则运算符(~ ~! 匹配正则表达式和不匹配正则表达式)
- 高级输入输出
- 输出到一个文件 输出重定向
- 设置字段定界符
练习:
拷贝Week42.config文件并完成以下练习
名 姓:电话:过去三个月捐款数
- 显示所有电话号码
- 显示Dan的电话号码
- 显示Susan的名字和电话号码
- 显示所有以D开头的姓
- 显示所有以一个C或E开头的名
- 显示所有只有四个字符的名,这里可以使用length函数,举例: length(1)==10 1字符为10
- 显示所有区号为916的人名
- 显示Mike的捐款.显示每个值时都有以$开头.如$250$100$175
- 显示姓,其后跟一个逗号和名