AWK 常用语法与一行命令速查
常用命令
awk '{print $1}' file
awk -F: '{print $1, $3}' /etc/passwd
awk 'NR==1 || NR%2==0' file
awk '$3 > 100 {print $1, $3}' data.txt
awk '/error/ {count++} END {print count}' app.log
awk 'BEGIN {FS=","; OFS="\t"} {print $1, $2}' data.csv
awk '{sum += $2} END {printf "%.2f\n", sum}' data.txt
awk '{a[$1] += $2} END {for (k in a) print k, a[k]}' data.txt
awk '!seen[$0]++' file
awk 'NF' file
awk '{print NR": "$0}' file
常用变量与模式
| 写法 |
含义 |
$0 |
整行 |
$1..$n |
第 n 个字段 |
NR |
当前行号 |
NF |
当前行字段数 |
FS / OFS |
输入/输出分隔符 |
BEGIN / END |
处理前/后执行 |
/regex/ |
匹配行 |
!seen[$0]++ |
去重保序 |
场景速查
| 目的 |
写法 |
| 按列求和 |
awk '{s+=$2} END{print s}' |
| 按 key 聚合 |
awk '{a[$1]+=$2} END{for(k in a) print k,a[k]}' |
| 条件过滤 |
awk '$3 ~ /error/ {print}' |
| 格式化输出 |
awk '{printf "%-10s %s\n", $1, $2}' |
| 多文件处理 |
awk 'FNR==1{print FILENAME}' file1 file2 |
| 替换字段 |
awk '{$2="x"; print}' OFS=, |
易错点
- 默认按空白分割,不是按逗号;用
-F, 或 FS=","。
$1 在 BEGIN 里没有意义,输入还没读入。
- 数组遍历顺序不保证;需要排序时用
asort 或外部 sort。
- 浮点比较和 printf 格式要显式控制,避免精度问题。
- 大文件用 awk 比 shell 循环快,但复杂逻辑可读性差;必要时写脚本。
相关命令
sed — 流编辑
grep — 文本搜索
cut / sort / uniq — 常用管道