awk是三位创始人名称的姓氏首字母(Alfred Aho 、Peter Weinberger 和 Brian Kernighan),是用于处理结构化的文本数据,非常适合用于报告生成、数据分析和其他需要文本解析的任务。
1. 基本语法
❯Bash
awk 'pattern {action}' filename
# pattern: 匹配条件,如果一行满足这个条件,则执行相应的动作。用斜杠(/pattern/)括起来
# {action}: 当匹配条件为真时要执行的命令。2. 字段分割
awk默认将输入行按照空格或制表符分割成一系列字段,可以通过 $1, $2, …来引用这些字段。可以使用-F或--field-separator参数来指定其他分隔符。
例如,打印文件中的第二列:
❯Bash
# print $0是整个字符串 $1是第一个,以此类推
$ echo "Hello World" | awk '{print $2}'
World
$ echo "Hello World, Hello awk" | awk '{print $2 $3}'
World,Hello
$ echo "Hello World, Hello awk" | awk '{print $2 " " $3}'
World, Hello
$ echo "Hello World, Hello awk" | awk '{print "string is: " $2 " + " $3}'
string is: World, + Hello
# -F 可以指定分隔符 分隔符可以不止一个
$ echo "Hello World, Hello awk" | awk -F "," '{print "string is: " $2}'
string is: Hello awk3. 匹配模式
使用模式来选择需要处理的行。模式可以是简单的字符串或正则表达式。
❯Bash
# 打印包含error的行
awk '/error/ {print}' filename4. 条件语句
使用if语句来基于条件执行不同的操作。
❯Bash
# 打印第一列大于10的行
$ awk '$1 > 10 {print}' filename5 变量和函数
awk 支持内置变量(如 NR 表示记录数,NF 表示字段数)和自定义变量。还可以定义和使用函数
| 变量名 | 属性 |
|---|---|
| $0 | 当前记录 |
| n | 当前记录的第n个字段 |
| FS | 输入字段分隔符 默认是空格 |
| RS | 输入记录分隔符 默认为换行符 |
| NF | 当前记录中的字段个数,就是有多少列 |
| NR | 已经读出的记录数,就是行号,从1开始 |
| OFS | 输出字段分隔符,默认也是空格 |
| ORS | 输出记录的分隔符 默认为换行符 |
❯Bash
# 只查看第20行到30行的内容
$ awk '{if(NR>=20 && NR<=30) print $1}' test.txt
# 记录总和
$ awk '{sum += $1} END {print sum}' filename6. 流程控制
支持 if, else, for, while, do-while 等控制结构
7. BEGIN 和 END规则
BEGIN: 在任何输入被读取之前执行的动作。END: 所有输入被读取之后执行的动作。
❯Bash
# 先打印标题,后打印内容
$ awk 'BEGIN {print "ID\tValue"} {print $1 "\t" $2}' filename