你所不知道的awk

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文件并完成以下练习
名 姓:电话:过去三个月捐款数
在这里插入图片描述

  1. 显示所有电话号码
    在这里插入图片描述
  2. 显示Dan的电话号码
    在这里插入图片描述
  3. 显示Susan的名字和电话号码
    在这里插入图片描述
  4. 显示所有以D开头的姓
    在这里插入图片描述
  5. 显示所有以一个C或E开头的名
    在这里插入图片描述
  6. 显示所有只有四个字符的名,这里可以使用length函数,举例: length(1)==10 1字符为10
    在这里插入图片描述
  7. 显示所有区号为916的人名
    在这里插入图片描述
  8. 显示Mike的捐款.显示每个值时都有以$开头.如$250$100$175
    在这里插入图片描述
  9. 显示姓,其后跟一个逗号和名
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yr137157/article/details/83861903