4. awk 指令
语法
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 this is a test |
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 | $ ls -l *.txt | awk '{sum+=$5} END {print sum}' |
- 从文件中找出超过 80 个字符的行:
1 | $ awk 'length($0) > 80' file.txt |
- 打印 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")}' |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
