Linux 中 awk 的用法详解
awk 是 Linux 下强大的文本处理工具,擅长对结构化文本(如日志、CSV 等)进行模式扫描和处理。其核心逻辑是 逐行扫描文件 → 按条件匹配 → 执行操作。以下是关键用法:
1. 基本结构
awk '模式 {动作}' 文件名
- 模式:条件表达式(可省略,表示处理所有行)
- 动作:对匹配行执行的操作(可省略,默认打印整行)
2. 字段操作
- 默认分隔符:空格/制表符
- 字段引用:
$0:整行$1:第 1 列$NF:最后一列$(NF-1):倒数第 2 列
示例:打印第 1 列和第 3 列
awk '{print $1, $3}' data.txt
3. 设置分隔符
- 输入分隔符
-F:awk -F',' '{print $2}' data.csv # 按逗号分隔 - 输出分隔符
OFS:awk 'BEGIN{OFS=";"} {print $1,$3}' data.txt # 输出用分号分隔
4. 特殊模式
BEGIN:处理前执行END:处理后执行
awk 'BEGIN{sum=0} {sum+=$1} END{print "总和:" sum}' nums.txt
5. 条件过滤
- 数值比较:
awk '$3 > 100 {print $0}' sales.txt # 第 3 列大于 100 的行 - 正则匹配:
awk '/error/ {print $2}' log.txt # 包含 "error" 的行 awk '$1 ~ /^2023/ {print}' data.log # 第 1 列以 2023 开头
6. 内置变量
| 变量 | 说明 | 示例 |
|---|---|---|
NR | 当前行号 | awk 'NR==5' file |
NF | 当前行列数 | awk '{print NF}' file |
FS | 输入字段分隔符 | BEGIN{FS=":"} |
RS | 输入行分隔符 | BEGIN{RS="\n\n"} |
7. 数学运算
支持 + - * / % ^ 等运算:
awk '{avg=($2+$3)/2; print $1, avg}' scores.txt
8. 流程控制
支持 if、for、while:
awk '{if($2>50) print $1 "合格"; else print "不合格"}' results.txt
9. 数组操作
统计列值频次:
awk '{count[$1]++} END{for(item in count) print item, count[item]}' access.log
10. 常用组合示例
- 提取特定行:
awk 'NR>=10 && NR<=20' file.txt # 10~20 行 - 求和计算:
awk '{sum+=$4} END{printf "总计: %.2f\n", sum}' finance.dat - 字段重组:
awk -F':' '{print $3 ":" $1}' /etc/passwd # 交换 UID 和用户名
总结流程图
graph LR
A[读取文件] --> B{模式匹配?}
B -- 是 --> C[执行动作]
B -- 否 --> A
C --> D[输出结果]
D --> A
掌握这些技巧可高效处理日志分析、数据清洗等任务。建议通过 man awk 查看完整文档。
2万+

被折叠的 条评论
为什么被折叠?



