Linux-awk命令
·
分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程
https://www.captainai.net/troubleshooter
awk 是 Linux/Unix 下功能极其强大的文本处理编程语言,核心是按行读取、按字段分割、模式匹配、数据计算与格式化输出,是 Shell 三剑客(grep/sed/awk)中最擅长结构化数据解析、统计报表的工具。
一、基本语法
awk [选项] '模式 { 动作 }' 文件名
-
选项
-F '分隔符':指定字段分隔符(默认空格 / 制表符)- 例:
-F:(冒号)、-F,(逗号)、-F '[:;]'(冒号或分号)
- 例:
-v 变量=值:定义外部变量- 例:
awk -v num=100 '{print $1+num}'
- 例:
-f 脚本.awk:从文件读 awk 脚本
-
模式(筛选条件)
- 省略:处理所有行
/正则/:匹配包含正则的行- 例:
/error/、/^root/、/[0-9]+/
- 例:
NR==5:第 5 行$3 > 100:第 3 字段 > 100BEGIN{}:处理前执行(初始化、表头)END{}:处理完所有行后执行(统计、汇总)
-
动作
print $1, $3:打印第 1、3 字段$2="OK":修改第 2 字段- 支持:
if/else、for、数组、数学运算
二、核心内置变量
$0:当前整行$1, $2, ... $NF:第 1/2 / 最后 1 字段NR:当前行号(Number of Record)NF:当前行字段总数(Number of Field)FS:字段分隔符(同-F)OFS:输出字段分隔符(默认空格)
三、高频实用示例(必掌握)
1. 提取列(最常用)
# 打印第1、3列(默认空格分隔)
awk '{print $1, $3}' data.txt
# 冒号分隔(/etc/passwd):用户名、家目录
awk -F: '{print $1, $6}' /etc/passwd
# 打印最后一列
awk '{print $NF}' file.txt
# 打印倒数第二列
awk '{print $(NF-1)}' file.txt
2. 条件过滤
# 包含root的行
awk '/root/' /etc/passwd
# 第3列>30,打印整行
awk '$3>30' data.txt
# 行号2~5行
awk 'NR==2,NR==5' file.txt
3. 统计计算
# 统计文件行数
awk 'END{print NR}' file.txt
# 第3列求和(如日志大小)
awk '{sum+=$3} END{print "总和:", sum}' access.log
# 统计每个IP出现次数(Nginx日志)
awk '{ip[$1]++} END{for(i in ip) print i, ip[i]}' access.log
4. BEGIN/END 报表
awk -F, '
BEGIN {
print "日期 产品 金额"
print "-------------"
}
NR>1 { # 跳过表头
sum += $3
print $1, $2, $3
}
END {
print "-------------"
print "总金额:", sum
}' sales.csv
5. 字符串替换 / 修改
# 第2列改为大写
awk '{$2=toupper($2)} 1' file.txt # 1=默认print
# 替换整行中old为new
awk '{gsub(/old/, "new")} 1' file.txt
四、与 sed/grep 对比
- grep:行级过滤(找包含关键字的行)
- sed:行级编辑(替换、删除行)
- awk:字段级处理 + 计算 + 报表(最全能)
五、简单脚本写法
report.awk:
#!/bin/awk -f
BEGIN { FS=":"; print "用户列表" }
{ print NR, $1 }
END { print "总数:", NR }
执行:
chmod +x report.awk
./report.awk /etc/passwd
一句话总结:awk 把文本当表格用,$1/$2 取列、NR 取行、BEGIN/END 做头尾,过滤、计算、格式化一气呵成。
更多推荐


所有评论(0)