1. 命令概述
- 命令名称:
awk(以三位创始人 Aho、Weinberger、Kernighan 的姓氏首字母命名) - 核心功能:强大的文本处理工具,支持模式扫描和文本处理语言
- 主要用途:文本分析、数据提取、报表生成、文本转换
2. 语法格式
awk '模式 {动作}' 文件
awk -f 脚本文件 输入文件
3. 基本结构
# 基本语法
awk 'BEGIN {初始化操作} 模式 {动作} END {结束操作}' 文件
# 示例:打印文件内容
awk '{print}' file.txt
4. 常用内置变量
| 变量 | 说明 |
|---|---|
$0 | 当前行的全部内容 |
$1 | 当前行的第1个字段 |
$2 | 当前行的第2个字段 |
$n | 当前行的第n个字段 |
NF | 当前行的字段数量 |
NR | 当前处理的行号 |
FNR | 当前文件的行号 |
FS | 输入字段分隔符(默认空格) |
OFS | 输出字段分隔符(默认空格) |
RS | 输入记录分隔符(默认换行符) |
ORS | 输出记录分隔符(默认换行符) |
FILENAME | 当前处理的文件名 |
5. 常用实例详解
(1) 基本打印操作
# 打印文件所有内容
awk '{print}' file.txt
# 打印第1列
awk '{print $1}' file.txt
# 打印第1列和第3列
awk '{print $1, $3}' file.txt
# 打印最后一列
awk '{print $NF}' file.txt
# 打印行号和内容
awk '{print NR, $0}' file.txt
(2) 条件过滤
# 打印第2列等于"test"的行
awk '$2 == "test" {print}' file.txt
# 打印第3列大于100的行
awk '$3 > 100 {print}' file.txt
# 打印第1列包含"error"的行
awk '$1 ~ /error/ {print}' file.txt
# 打印第2列不包含"debug"的行
awk '$2 !~ /debug/ {print}' file.txt
# 打印行号大于10的行
awk 'NR > 10 {print}' file.txt
(3) 字段分隔符
# 使用冒号作为分隔符
awk -F: '{print $1}' /etc/passwd
# 使用多个分隔符
awk -F'[:;]' '{print $1}' file.txt
# 设置输出分隔符
awk 'BEGIN{OFS="\t"} {print $1, $2}' file.txt
# 使用正则表达式作为分隔符
awk -F'[ ,]+' '{print $1}' file.txt
(4) BEGIN 和 END 块
# 在开始前执行
awk 'BEGIN {print "开始处理文件"} {print} END {print "处理完成"}' file.txt
# 统计行数
awk 'END {print NR}' file.txt
# 统计字段数
awk 'END {print NF}' file.txt
# 计算总和
awk '{sum += $1} END {print sum}' file.txt
# 计算平均值
awk '{sum += $1} END {print sum/NR}' file.txt
6. 实际应用场景
场景一:日志分析
# 统计访问日志中的IP访问次数
awk '{print $1}' access.log | sort | uniq -c | sort -nr
# 提取错误日志
awk '/ERROR/ {print}' app.log
# 统计不同状态码数量
awk '{print $9}' access.log | sort | uniq -c
# 统计每分钟请求数
awk '{print substr($4,14,5)}' access.log | sort | uniq -c
场景二:系统监控
# 查看进程内存使用
ps aux | awk '{print $2, $4, $11}' | sort -k2 -nr | head -10
# 查看磁盘使用情况
df -h | awk '$5 > 80 {print}'
# 查看CPU使用率
top -bn1 | awk '/Cpu/ {print "CPU使用率:", $2}'
# 查看内存使用情况
free -h | awk '/Mem/ {print "内存使用:", $3"/"$2}'
场景三:数据提取
# 提取CSV文件的特定列
awk -F, '{print $1, $3}' data.csv
# 提取JSON数据(简单格式)
awk -F'"' '/"name":/ {print $4}' data.json
# 提取URL中的域名
awk -F/ '{print $3}' urls.txt
# 提取邮箱用户名
awk -F@ '{print $1}' emails.txt
场景四:文本转换
# 将空格分隔转换为逗号分隔
awk '{print $1","$2","$3}' file.txt
# 将小写转换为大写
awk '{print toupper($0)}' file.txt
# 将第一列和第三列交换
awk '{print $3, $2, $1}' file.txt
# 添加行号
awk '{print NR, $0}' file.txt
7. 高级用法
(1) 数组操作
# 统计词频
awk '{for(i=1;i<=NF;i++) count[$i]++} END {for(word in count) print word, count[word]}' file.txt
# 按IP统计访问次数
awk '{ip[$1]++} END {for(i in ip) print i, ip[i]}' access.log
# 按日期统计访问量
awk '{date=substr($4,2,11); count[date]++} END {for(d in count) print d, count[d]}' access.log
(2) 字符串函数
# 字符串长度
awk '{print length($0)}' file.txt
# 字符串截取
awk '{print substr($1, 1, 3)}' file.txt
# 字符串替换
awk '{gsub(/old/, "new"); print}' file.txt
# 字符串分割
awk '{split($0, arr, ":"); print arr[1]}' file.txt
(3) 数学运算
# 四则运算
awk '{print $1 + $2, $1 - $2, $1 * $2, $1 / $2}' file.txt
# 取整和取余
awk '{print int($1), $1 % 2}' file.txt
# 平方和开方
awk '{print $1^2, sqrt($1)}' file.txt
(4) 多文件处理
# 处理多个文件
awk '{print FILENAME, NR, $0}' file1.txt file2.txt
# 合并两个文件
awk 'FNR==NR {a[$1]=$2; next} {print $1, a[$1], $2}' file1.txt file2.txt
# 比较两个文件
awk 'NR==FNR {a[$0]; next} !($0 in a)' file1.txt file2.txt
8. 注意事项
- 字段分隔符:默认使用空格和制表符分隔,可使用
-F指定分隔符 - 模式匹配:支持正则表达式,使用
~进行匹配 - 变量作用域:变量在 BEGIN、主块、END 之间共享
- 数组索引:数组索引可以是数字或字符串
- 性能优化:处理大文件时,避免在循环中频繁调用系统命令
9. 常见问题解决
(1) 分隔符问题
# 使用多个分隔符
awk -F'[ :]' '{print $1}' file.txt
# 使用正则表达式分隔符
awk -F'[[:space:]]+' '{print $1}' file.txt
(2) 特殊字符处理
# 处理包含空格的字段
awk -F'"' '{print $2}' file.txt
# 处理制表符分隔的文件
awk -F'\t' '{print $1}' file.txt
# 处理固定宽度文件
awk '{print substr($0, 1, 10)}' file.txt
(3) 性能问题
# 避免在循环中调用外部命令
awk '{system("echo " $1)}' file.txt # 慢
awk '{print $1}' file.txt # 快
# 使用内置函数代替外部命令
awk '{print tolower($0)}' file.txt # 使用内置函数
(4) 内存不足
# 处理大文件时分块处理
awk 'NR % 1000 == 1 {print > "chunk_" NR ".txt"}' largefile.txt
# 使用流式处理,避免加载整个文件到内存
awk '{if($1 > 100) print}' largefile.txt
核心要点总结:
awk是强大的文本处理工具,支持模式扫描和文本处理语言- 基本结构:
BEGIN {初始化} 模式 {动作} END {结束} - 内置变量:
$0(整行)、$n(第n列)、NF(字段数)、NR(行号) - 常用选项:
-F(指定分隔符)、-f(指定脚本文件) - 实际应用:日志分析、系统监控、数据提取、文本转换
- 高级功能:数组操作、字符串函数、数学运算、多文件处理
- 性能优化:避免在循环中调用外部命令,使用内置函数
awk 命令是 Linux 系统管理和数据处理的核心工具,熟练掌握可以大大提高工作效率。