Linux shell文本三剑客之awk的使用

10 篇文章 0 订阅

一、awk 概述

  1. awk 是一种可用于选择文件中的特定记录并对其执行操作的程序。
  2. awk 命令行语法如下

    awk [options] -f progfile [- -] file …

    awk [options] [–] ‘program’ file …

    • options是命令行选项
    • progfile是awk程序文件
    • --表示命令行选项截止,以后首字母为-的文件或其它不会视为选项
    • file为输入文件
    • program为awk程序脚本
  3. awk 可以使用管道,也可以将管道输入看做文件,可以使用-来代替

    some_command | awk -f ‘program’ file1 - file2

二、常用命令行选项

  1. -F fs 设置FS,字段分隔符
  2. -f source-filesource-file读取程序,可多次指定
  3. -v var=val 设置变量var的值为val,使用-v一次只能设置一个变量,但是可以多次使用-v

三、常用内置变量

  1. FS(Field Separators)

    • 字段分隔符,默认为" "。不仅可以是空格,还可以是\t和\n,还是组合的序列。
    • 可以设置为单字符或正则。
  2. OFS(Output Field Separator)

    • 输出字段分隔符,默认为" "。
  3. RS(Record Separator)

    • 记录分隔符,默认为\n。
    • 记录可以不止以行分隔,当RS设置为空时,类似于设置\n\n+,可以用空行来分隔记录.
    cat>addresses<<-EOF
    Jane Doe
    123 Main Street
    Anywhere, SE 12345-6789
    
    John Smith
    456 Tree-lined Avenue
    Smallville, MW 98765-4321
    EOF
    
    awk 'BEGIN{RS="";FS="\n"} {print "Name is:",$1;print "Address is:",$2;print "City and state are:", $3;print ""}' addresses
    awk 'BEGIN{RS="\n\n+";FS="\n"} {print "Name is:",$1;print "Address is:",$2;print "City and state are:", $3;print ""}' addresses
    
  4. ORS(Output Record Separator)

    • 输出记录分隔符,默认为\n
  5. NR(Number of Records)

    • 从程序开始执行,正在处理的记录数,每读一条Record加1
  6. NF(Number of Fields )

    • 当前输入记录中的字段总数,一个新的记录被读取,NF就被重置
  7. FNR(File Number of Records)

    • 当前文件中的当前记录编号,当一个新文件读取,FNR重置为0,而NR不会

四、awk 程序脚本

awk 程序的语法如下

[pattern] { action }

pattern [{ action }]



function name(args) { … }

1. pattern

pattern 即模式,pattern用来查找匹配的record

  • BEGIN 会在读入第一条record前被执行,而且只执行一次
  • END 会在所有record读取完毕执行,也只会执行一次
  • /regular expression/ 正则表达式,匹配输入的record
  • expression 如果表达式的值为非零(如果是数字)或非空(如果是字符串),则模式匹配
  • begpat, endpat 匹配范围从开始模式begpat到结束模式endpat
  • pattern 为空,那代表匹配每一条record

2. action

  1. action 是在匹配pattern后,需要完成的动作。使用action 时{}不能省略,如果只有pattern,没有action,那相当于{print $0}。
  2. action 包含以下类型语句
    • 表达式语句 调用函数或者为变量赋值
    • 控制语句 控制的程序流程
      • If语句: 有条件地执行一些 awk 语句.
        if (condition) then-body [else else-body]
        
      • While语句: 循环, 直到满足某些条件.
        while (condition)
        	body
        
      • Do语句: 在循环时执行指定的操作, 直到满足某些条件.
        do
          body
        while (condition)
        
      • For语句: 另一个循环语句, 提供初始化和增量子句
        for (initialization; condition; increment)
        	body
        
      • Switch语句: 基于值的语句,按条件执行
        switch (expression) {
        	case value or regular expression:
        	    case-body
        	default:
        	    default-body
        	}
        
      • Break语句: 终止当前循环执行
        break
        
      • Continue语句: 结束本次循环,进行下一次循环
        continue
        
      • Next语句: 停止处理当前输入记录
        next
        
      • Nextfile语句: 停止处理当前文件
        nextfile
        
      • Exit语句: 停止awk执行.
        exit [return code]
        
    • 复合语句 用大括号包裹的多条语句
    • 输入语句 使用getline,next,nextfile获取输入
    • 输出语句 例如print,printf
    • 删除语句 使用delete删除数组元素

五、awk 数组

  • awk 数组的索引可以是数字、字符串,不必是连续的正整数。数字也是被当成字符串保存的。
  • 遍历数组
    for (var in array)
        body
    
  • 删除数组元素
    delete array[index-expression]
    
  • 多维数组
    • 多维数组的索引不是单个的索引,而是多个索引序列。例如二维数组,索引就是两个,array[x,y]
    • 多维数组实际上还是一维数组,只是将多维数组的多个索引转化为字符串用内置变量SUBSEP来连接。例如:当SUBSEP=@时,array[1,2]与array[1@2]等价。默认SUBSEP为"\034"
    • 多维数组遍历
      for (combined in array) {
      	# split分割字符串为数组
          split(combined, separate, SUBSEP)
      	# separate[1]是第一个}
      

六、awk 函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aabond

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值