在 Shell 中,如何使用 awk 命令处理文本文件?

在Shell环境中,awk是一种强大的文本处理工具,适用于结构化文本的逐行处理。以下是awk的核心用法及典型场景:

一、基础语法结构

awk 'pattern {action}' [input_file]

  • pattern:匹配条件(可省略,默认处理所有行)
  • action:执行操作(需用{}包裹)
  • 支持多命令组合:awk 'BEGIN{} /pattern/ {action1; action2} END{}'

二、核心处理能力

  1. 字段提取
# 提取第1列和第3列(默认空格/TAB分隔)
awk '{print $1, $3}' file.txt

# 自定义分隔符(-F参数)
awk -F',' '{print $2}' data.csv  # CSV文件取第二列

  1. 条件过滤
# 筛选第3列大于100的行
awk '$3 > 100 {print $0}' data.txt

# 正则匹配(包含"error"的行)
awk '/error/ {print NR ":" $0}' log.txt  # NR表示当前行号

  1. 数学运算
# 求第2列总和
awk '{sum+=$2} END {print "Total:", sum}' sales.dat

# 计算平均值
awk '{sum+=$3; count++} END {printf "Avg: %.2f\n", sum/count}' data.txt

  1. 内置变量
  • NR:已读记录数(行号)
  • NF:当前行的字段数量
  • FS:输入字段分隔符(默认为空格)
  • OFS:输出字段分隔符(默认为空格)

三、高级功能示例

  1. 预处理与后处理
# 输出表头(BEGIN块)
awk 'BEGIN {print "Name\tSalary"} $2 > 5000 {print $1, $2}' employees.txt

# 结果汇总(END块)
awk '{sum+=$4} END {print "季度总销售额:", sum}' Q1_sales.txt

  1. 字段重组
# 倒序输出字段
awk '{for(i=NF; i>=1; i--) printf "%s ", $i; print ""}' text.txt

  1. 关联数组统计
# 统计不同IP访问次数
awk '{ip_count[$1]++} END {for(ip in ip_count) print ip, ip_count[access.log]}'

四、实用技巧

  1. 多文件处理
awk '{print FILENAME ":" NR, $0}' file1.txt file2.txt  # 显示文件名+行号

  1. 字段修改
# 将第三列转为大写
awk '{$3 = toupper($3); print}' data.txt

  1. 复杂分隔符
# 处理多字符分隔符(如"|||")
awk -F'\\|\\|\\|' '{print $2}' multiline.log

建议通过man awk查看完整手册,掌握模式匹配、自定义函数、多文件处理等进阶功能。对于复杂文本处理任务,awk的执行效率通常优于纯Shell脚本实现。

全部评论

相关推荐

03-28 22:31
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务