在 Shell 中,如何使用 awk 命令处理文本文件?
在Shell环境中,awk是一种强大的文本处理工具,适用于结构化文本的逐行处理。以下是awk的核心用法及典型场景:
一、基础语法结构
awk 'pattern {action}' [input_file]
- pattern:匹配条件(可省略,默认处理所有行)
- action:执行操作(需用{}包裹)
- 支持多命令组合:
awk 'BEGIN{} /pattern/ {action1; action2} END{}'
二、核心处理能力
- 字段提取
# 提取第1列和第3列(默认空格/TAB分隔) awk '{print $1, $3}' file.txt # 自定义分隔符(-F参数) awk -F',' '{print $2}' data.csv # CSV文件取第二列
- 条件过滤
# 筛选第3列大于100的行 awk '$3 > 100 {print $0}' data.txt # 正则匹配(包含"error"的行) awk '/error/ {print NR ":" $0}' log.txt # NR表示当前行号
- 数学运算
# 求第2列总和 awk '{sum+=$2} END {print "Total:", sum}' sales.dat # 计算平均值 awk '{sum+=$3; count++} END {printf "Avg: %.2f\n", sum/count}' data.txt
- 内置变量
NR
:已读记录数(行号)NF
:当前行的字段数量FS
:输入字段分隔符(默认为空格)OFS
:输出字段分隔符(默认为空格)
三、高级功能示例
- 预处理与后处理
# 输出表头(BEGIN块) awk 'BEGIN {print "Name\tSalary"} $2 > 5000 {print $1, $2}' employees.txt # 结果汇总(END块) awk '{sum+=$4} END {print "季度总销售额:", sum}' Q1_sales.txt
- 字段重组
# 倒序输出字段 awk '{for(i=NF; i>=1; i--) printf "%s ", $i; print ""}' text.txt
- 关联数组统计
# 统计不同IP访问次数 awk '{ip_count[$1]++} END {for(ip in ip_count) print ip, ip_count[access.log]}'
四、实用技巧
- 多文件处理
awk '{print FILENAME ":" NR, $0}' file1.txt file2.txt # 显示文件名+行号
- 字段修改
# 将第三列转为大写 awk '{$3 = toupper($3); print}' data.txt
- 复杂分隔符
# 处理多字符分隔符(如"|||") awk -F'\\|\\|\\|' '{print $2}' multiline.log
建议通过man awk
查看完整手册,掌握模式匹配、自定义函数、多文件处理等进阶功能。对于复杂文本处理任务,awk的执行效率通常优于纯Shell脚本实现。