Linux常用命令学习笔记:awk

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. 注意事项

  1. 字段分隔符:默认使用空格和制表符分隔,可使用 -F 指定分隔符
  2. 模式匹配:支持正则表达式,使用 ~ 进行匹配
  3. 变量作用域:变量在 BEGIN、主块、END 之间共享
  4. 数组索引:数组索引可以是数字或字符串
  5. 性能优化:处理大文件时,避免在循环中频繁调用系统命令

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 系统管理和数据处理的核心工具,熟练掌握可以大大提高工作效率。


作 者:南烛
链 接:https://www.itnotes.top/archives/315
来 源:IT笔记
文章版权归作者所有,转载请注明出处!


上一篇
下一篇