Shell中awk命令的经典用法示例

awk命令简介

awk是一种强大的文本分析和处理工具,广泛用于Linux/Unix系统中。它不仅能够处理文本文件,还能进行复杂的模式匹配、数据分析和报表生成。awk的名字来源于其三位创始人的姓氏首字母:Alfred Aho、Peter Weinberger和Brian Kernighan。

经典awk命令示例

1. 基本语法和打印操作

awk的基本语法是:awk 'pattern {action}' filename

# 打印文件的每一行
awk '{print}' filename.txt

# 打印文件的第一列和第二列
awk '{print $1,$2}' filename.txt

# 打印文件的第一列和第三列,用逗号分隔
awk '{print $1","$3}' filename.txt

# 打印整行并在前面加上行号
awk '{print NR":"$0}' filename.txt

2. 模式匹配和过滤

# 打印包含"pattern"的行
awk '/pattern/ {print}' filename.txt

# 打印第三列大于10的行的第一列和第二列
awk '$3 > 10 {print $1, $2}' filename.txt

# 打印第一列等于"root"的行
awk '$1 == "root" {print}' /etc/passwd

# 使用正则表达式匹配
awk '/^[0-9]+$/ {print}' filename.txt  # 匹配纯数字行

3. 字段分隔符

# 使用冒号作为分隔符(如处理/etc/passwd文件)
awk -F: '{print $1,$7}' /etc/passwd

# 使用多个字符作为分隔符
awk -F'[ ,]+' '{print $1,$2}' filename.txt

# 在BEGIN块中设置分隔符
awk 'BEGIN{FS=":"} {print $1,$7}' /etc/passwd

4. 统计和计算

# 计算文件行数
awk 'END{print NR}' filename.txt

# 计算文件中每行的字段数
awk '{print NF}' filename.txt

# 计算第一列数值的总和
awk '{sum+=$1} END{print sum}' filename.txt

# 计算第一列数值的平均值
awk '{sum+=$1} END{print sum/NR}' filename.txt

# 找出第一列的最大值
awk 'BEGIN{max=0} {if($1>max) max=$1} END{print max}' filename.txt

# 找出第一列的最小值
awk 'BEGIN{min=999999} {if($1<min) min=$1} END{print min}' filename.txt

5. 条件处理

# 使用if语句进行条件处理
awk '{if($3 > 100) print $1,"high"}' filename.txt

# 使用三元运算符
awk '{print ($3 > 100) ? $1" high" : $1" low"}' filename.txt

# 多条件判断
awk '{if($3 > 100) print $1,"high"; else if($3 > 50) print $1,"medium"; else print $1,"low"}' filename.txt

6. BEGIN和END块

# 在处理前和处理后执行操作
awk 'BEGIN{print "Processing start..."} {print $0} END{print "Processing end..."}' filename.txt

# 初始化变量
awk 'BEGIN{sum=0} {sum+=$1} END{print "Sum:",sum}' filename.txt

# 设置输出分隔符
awk 'BEGIN{OFS=":"} {print $1,$2,$3}' filename.txt

7. 数组操作

# 统计各字段值出现的次数
awk '{count[$1]++} END{for(word in count) print word,count[word]}' filename.txt

# 对数组排序输出
awk '{count[$1]++} END{for(word in count) print word,count[word] | "sort -rn -k2"}' filename.txt

8. 复杂示例

# 处理系统用户信息
awk -F: '{print "用户名:"$1,"UID:"$3}' /etc/passwd

# 统计日志中各状态码出现次数
awk '{print $9}' access.log | sort | uniq -c | sort -nr

# 格式化输出表格
awk 'BEGIN{printf "%-10s %-10s %-10s\n","姓名","年龄","城市"} {printf "%-10s %-10s %-10s\n",$1,$2,$3}' data.txt

# 处理CSV文件
awk -F, '{print $2","$1","$3}' data.csv

# 计算百分比
awk '{total+=$1} END{print "Percentage:",($1/total)*100"%"}' filename.txt

总结

awk是一个功能极其强大的文本处理工具,它不仅可以完成简单的文本打印和过滤操作,还可以进行复杂的数据分析和报表生成。掌握awk的基本语法和常用示例,能够大大提高我们在Linux/Unix系统中的文本处理效率。

通过上述示例可以看出,awk特别适合处理结构化的文本数据,如日志文件、CSV文件、系统配置文件等。在实际工作中,awk经常与其他命令(如grep、sort、uniq等)结合使用,形成强大的文本处理流水线。