awk是一种编程语言,用于在Linux/Unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其他命令的输出。awk支持用户自定义函数和动态正则表达式等先进功能,是Linux/Unix下的一个强大的编程工具。
awk 'pattern {action}' filename
awk -f scriptfile filename
awk -F fs 'program' filename
| 选项 | 说明 |
|---|---|
| -F fs | 指定输入字段分隔符,fs是一个字符串或者是一个正则表达式 |
| -v var=value | 赋值一个用户定义变量 |
| -f scriptfile | 从脚本文件中读取awk命令 |
| -W compact | 在紧凑模式下运行awk |
| -W traditional | 在传统模式下运行awk |
awk程序通常由三部分组成:BEGIN块、主体块、END块
awk 'BEGIN { actions }
pattern { actions }
END { actions }' filename
| 变量 | 说明 |
|---|---|
| FS | 字段分隔符(默认是空格) |
| OFS | 输出字段分隔符(默认是空格) |
| RS | 记录分隔符(默认是换行符) |
| ORS | 输出记录分隔符(默认是换行符) |
| NF | 当前记录的字段数量 |
| NR | 当前记录编号(行号) |
| FNR | 当前文件的记录编号 |
| FILENAME | 当前文件名 |
| ARGC | 命令行参数个数 |
| ARGV | 命令行参数数组 |
打印文件的特定列:
# 创建示例文件
echo -e "Alice 25 Engineer\nBob 30 Manager\nCharlie 28 Developer" > employees.txt
# 打印第一列(姓名)
awk '{print $1}' employees.txt
# 打印第一列和第三列
awk '{print $1, $3}' employees.txt
# 打印整行
awk '{print $0}' employees.txt
处理CSV或其他分隔符文件:
# 创建CSV文件
echo -e "Name,Age,Job\nAlice,25,Engineer\nBob,30,Manager" > data.csv
# 使用逗号作为分隔符
awk -F, '{print $1, $2}' data.csv
# 处理/etc/passwd文件(冒号分隔)
awk -F: '{print $1, $6}' /etc/passwd
基于条件筛选数据:
# 显示年龄大于26的员工
awk '$2 > 26 {print $1, $2}' employees.txt
# 显示职位为Manager的员工
awk '$3 == "Manager" {print $0}' employees.txt
# 使用正则表达式匹配
awk '/Manager/ {print $0}' employees.txt
# 显示行号大于1的记录(跳过标题)
awk 'NR > 1 {print $0}' employees.txt
在处理前后执行操作:
# 添加标题和统计信息
awk 'BEGIN {print "员工列表"; print "=========="}
{print $0}
END {print "=========="; print "总记录数:", NR}' employees.txt
# 计算年龄总和
awk '{sum += $2} END {print "平均年龄:", sum/NR}' employees.txt
对字段进行计算并格式化输出:
# 创建包含数字的文件
echo -e "100 200\n300 400\n500 600" > numbers.txt
# 计算每行数字的和
awk '{sum = $1 + $2; print $1, "+", $2, "=", sum}' numbers.txt
# 格式化输出
awk '{printf "姓名: %-10s 年龄: %2d\n", $1, $2}' employees.txt
使用awk内置函数处理字符串和数字:
# 字符串函数
echo "hello world" | awk '{print toupper($0)}'
echo "HELLO WORLD" | awk '{print tolower($0)}'
echo "hello world" | awk '{print length($0)}'
# 数学函数
echo "5.7" | awk '{print int($1)}'
echo "16" | awk '{print sqrt($1)}'
同时处理多个输入文件:
# 创建第二个文件
echo -e "David 35 Designer\nEve 32 Analyst" > employees2.txt
# 处理多个文件
awk '{print FILENAME, NR, $0}' employees.txt employees2.txt
使用复杂的模式匹配:
# 范围模式
awk 'NR==2, NR==4 {print NR, $0}' employees.txt
# 组合条件
awk '$2 > 26 && $3 ~ /Dev/ {print $0}' employees.txt
# 使用next跳过某些记录
awk '$2 < 28 {next} {print $0}' employees.txt
对于复杂的awk操作,可以创建脚本文件:
# 创建awk脚本
cat > process.awk << 'EOF'
BEGIN {
print "开始处理员工数据"
print "================="
}
{
if ($2 > 27) {
count++
print "员工:", $1, "年龄:", $2, "职位:", $3
}
}
END {
print "================="
print "符合条件的员工数量:", count
}
EOF
# 使用脚本文件
awk -f process.awk employees.txt
提取和分析服务器日志中的特定信息
从数据文件中生成统计报表和摘要
格式化文本数据,转换数据格式
处理系统命令输出,自动化管理任务