Linux awk 数据分析、字段截取实战
一、awk 简介
awk 是 Linux文本三剑客之一,擅长按列截取、统计计算、格式化输出、日志数据分析,默认以空格 / 制表符分割字段,处理结构化日志、表格类文本效率极高。
核心特点
- 按行读取文本,逐行拆分字段处理
- 默认字段分隔符空格,可自定义分隔符
- 支持变量、判断、循环、数值运算
- 常用于截取 IP、端口、访问量、服务统计
基础语法
bash
运行
awk [选项] '匹配规则{执行动作}' 文件名二、内置变量(必记)
$0:整行全部内容$1:第 1 列字段$2:第 2 列字段,依次类推NF:当前行总字段数NR:当前行号FS:输入字段分隔符
三、常用基础参数
-F:指定字段分隔符-v:自定义外部变量
四、基础字段截取实战
1. 截取单列、多列
bash
运行
# 只输出第一列 awk '{print $1}' test.txt # 输出第1列、第3列 awk '{print $1,$3}' test.txt # 输出整行内容 awk '{print $0}' test.txt2. 指定分隔符截取
文件以冒号、逗号、斜杠分割时,用-F指定分隔符
bash
运行
# 以冒号分割,取第一列 awk -F: '{print $1}' /etc/passwd # 以逗号分割截取字段 awk -F, '{print $2}' data.csv3. 打印行号、字段总数
bash
运行
# 显示行号+第一列 awk '{print NR,$1}' test.txt # 打印每行总列数 awk '{print NF}' test.txt # 打印最后一列 awk '{print $NF}' test.txt五、条件匹配筛选
1. 匹配包含指定字符串的行
bash
运行
# 匹配包含error的行,输出整行 awk '/error/{print $0}' app.log # 匹配包含root的行,输出第一列 awk '/root/{print $1}' /etc/passwd2. 数值条件判断
bash
运行
# 第二列数值大于100才输出 awk '$2>100{print $1,$2}' num.txt # 等于、小于判断 awk '$3==8080{print $0}' port.log3. 区间行筛选
bash
运行
# 只输出5到10行内容 awk 'NR>=5 && NR<=10{print $0}' test.txt六、格式化输出与拼接
自定义输出格式,拼接符号、文字
bash
运行
# 拼接字段与文字 awk '{print "IP:"$1,"状态:"$2}' net.log # 固定分隔符输出 awk '{print $1"|"$3"|"$5}' info.txt七、BEGIN、END 预处理与收尾
BEGIN{}:读取文本之前执行一次END{}:读取文本全部结束后执行一次
bash
运行
# 开头打印表头,结尾统计总行数 awk 'BEGIN{print "用户名UID"}{print $1,$3}END{print "总计行数:"NR}' /etc/passwd八、简单统计求和
bash
运行
# 统计第二列所有数值总和 awk '{sum+=$2}END{print "总和="sum}' score.txt # 统计匹配行数 awk '/200/{count++}END{print "成功请求数:"count}' access.log九、生产高频实战案例
1. Nginx 日志截取访问 IP
bash
运行
awk '{print $1}' access.log2. 筛选指定端口连接
bash
运行
netstat -ant | awk '$4~/8080/{print $0}'3. 过滤空行与注释行
bash
运行
awk '!/^#/ && !/^$/{print $0}' nginx.conf4. 统计在线客户端数量
bash
运行
ss -tn | awk 'NR>1{ip[$5]++}END{for(i in ip)print i,ip[i]}'5. 多分隔符混合截取
bash
运行
# 同时识别空格、冒号、斜杠作为分隔 awk -F'[: /]' '{print $4}' url.log十、三剑客场景区分速记
- grep:单纯筛选匹配行
- sed:批量修改、删除、替换文本
- awk:列截取、统计、计算、结构化数据分析
十一、极简命令总结
- 取列:
awk '{print $列数}' - 改分隔符:
awk -F分隔符 - 条件过滤:
awk '/关键词/{print}' - 数值统计:
sum+=$列 - 头尾处理:
BEGIN{}、END{}
