语法

1
awk options 'pattern {action}' file
  • options 选项, 用于控制 awk 的行为
    • -F 指定输入字段的分隔符, 默认是空格m 可以指定不同于默认分隔符的字段分隔符
    • -v <key>=<value> 定义局部变量, 可以在脚本中使用
    • -f <file> 从指定文件中读取 awk 脚本, 允许将脚本存储在文件中而不是命令行
  • pattern 模式, 用于匹配输入数据的模式, 如果省略则对所有行进行操作
    • 就是 regex 匹配语法
  • {action} 选在匹配到模式的行上执行的动作, 如果省略则打印整行
    • 打印操作, 纯字符串打印是 print, 打印对应变量是 printf "%10d", var, 10 表示宽度
    • 对于变量支持 += 等 c 语言运算符, 也可以有 for/if 等语句遵循 C 语言语法

内建变量 (可以直接用也可以手动改变)

  • $0 当前行的全部内容
  • ERRNO 上一个系统调用的错误信息
  • FS 输入字段分隔符, 默认是空格
  • IGNORECASE 是否忽略大小写, 默认是 0 (不忽略)
  • NF 一条记录的字段数目
  • NR 当前记录的行号, 从 1 开始
  • RS 记录分隔符, 默认是换行符

关键词

  • BEGIN{action} 在处理输入数据之前执行的动作, 通常用于初始化变量或打印标题
  • END{action} 在处理完所有输入数据后执行的动作, 通常用于打印总结信息
    合起来就是:
1
awk 'BEGIN{action} pattern {action} END{action}' file

基本用法

加入有如下文本 log.txt

1
2
3
4
2 this is a test
3 Do you like awk
This's a test
10 There are orange,apple,mongo
  • awk '{print $1,$4} log.txt` 会打印文件每一行的第一个和第四个字段 (没有第四个就打印最后一个, 只有一个就不打印 第四个), 字段是通过 分隔符 辨认的
  • awk -F, '{print $1, $2} log.txt` 会使用逗号作为分隔符, 打印每一行的第一个和第二个字段
  • awk -va=1 '{print $1, $1+a}' log.txt 会定义一个局部变量 a 的值为 1, 打印每一行的 1, 2 字段

Awesome awk Instructions

  1. 计算文本文件的大小:
1
2
3
$ ls -l *.txt | awk '{sum+=$5} END {print sum}'
--------------------------------------------------
666581
  1. 从文件中找出超过 80 个字符的行:
1
$ awk 'length($0) > 80' file.txt
  1. 打印 99 乘法表
1
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'