当前位置:首页>Linux>Linux 运维文本处理巅峰:awk 工具从入门到实战全解

Linux 运维文本处理巅峰:awk 工具从入门到实战全解

  • 2026-09-02 18:52:19
Linux 运维文本处理巅峰:awk 工具从入门到实战全解

技术弄巷

读完仅需

5
分钟

记得星标公众号

前言

在 Linux 运维工作中,日志分析、数据统计、字段提取、报表生成、自动化监控等场景,都离不开一款强大的文本处理工具——awk。它不仅是命令,更是一门微型编程语言,支持变量、判断、循环、数组、函数,能轻松完成 grep、sed 难以实现的复杂逻辑处理。

本文从零开始,系统梳理 awk 的工作流程、语法、内置变量、模式、判断、循环、数组、内置函数,覆盖运维 99% 高频用法,看完即可直接落地生产。

一、awk 工具介绍

工作流程

  1. 逐行读取
    文本内容
  2. 默认以空白字符分割字段
  3. 使用 $1 $2 $3 ...表示第1、2、3段内容
  4. $0
    表示整行内容
  5. -F
    可自定义分隔符

核心作用

文本提取、格式化输出、数据统计、逻辑计算、日志分析

基本语法

awk [选项] '条件{动作}' 文件1 文件2...
  • 常用动作:print(普通打印)、printf(格式化打印)

二、awk 基础使用

1. print 打印(最常用)

# 提取第一段(用户名)
awk -F: '{print $1}' /etc/passwd

# 打印整行
awk -F: '{print $0}' /etc/passwd

# 打印多段
awk -F: '{print $1, $3}' /etc/passwd

# 自定义提示文字
awk -F: '{print "用户名:",$1}' /etc/passwd

# 批量卸载软件
rpm -qa | grep php | awk -F-5 '{print "rpm -e --nodeps", $1}' | bash

2. printf 格式化输出

支持对齐、宽度、换行控制,适合生成规整报表

占位符
说明
%s
字符串
%d
整数
%f
浮点数
%10s
占10位,右对齐
%-10s
占10位,左对齐
\n
换行
# 左对齐输出,自动换行
awk -F: '{printf "%-15s %-20s\n",$1,$7}' /etc/passwd

# 磁盘信息格式化输出
df -hT | awk '/^\/dev/{printf "%-12s %-20s %-10s\n",$1,$7,$6}'

三、awk 常用内置变量

变量
作用
FS
输入字段分隔符(同 -F)
OFS
输出字段分隔符
NR
行号(多文件连续编号)
FNR
行号(多文件独立编号)
NF
当前行字段总数
$NF
最后一个字段
FILENAME
当前文件名

示例:

awk -v FS=":"'{print $1}' /etc/passwd
awk -v OFS="---" -F: '{print $1,$7}' /etc/passwd
awk 'NR==3{print}' /etc/passwd
awk '{print $NF}' /etc/passwd

四、awk 自定义变量

使用 -v定义变量,支持字符串、数字

awk -v name="martin"'{print "hello",name}' /etc/fstab
awk -v num=100 '{print num}' /etc/fstab

五、awk 常用处理模式

1. 表达式模式(比较/正则/逻辑)

# UID 1~999
awk -F: '$3>=1&&$3<=999{print $1}' /etc/passwd

# 匹配 nologin 结尾
awk -F: '$7~"/nologin$"{print $1}' /etc/passwd

# 磁盘使用率大于20%
df -hT | awk '/^\/dev/&&+$6>20{print $1,$7,$6}'

2. 正则模式

awk '/^tcp/{print}' netstat.log
awk -F: '/^[rhg]/{print $1}' /etc/passwd

3. 区间模式

# 提取时间段日志
awk '/Sep 26 09:00/,/Sep 26 10:00/{print}' messages

4. BEGIN{}(执行前)

awk 'BEGIN{print "开始统计"}'

5. END{}(执行后,统计必备)

awk '{sum++}END{print sum}' /etc/passwd

六、awk 条件判断

支持 if / if-else / if-elseif

# 判断管理员/普通用户
awk -F: '{if($3==0){print $1,"管理员"}else{print $1,"普通用户"}}' /etc/passwd

# 统计 shell 类型数量
awk -F: '{
    if($7=="/bin/bash") b++
    else if($7~"nologin") n++
}END{
    print "bash:",b,"nologin:",n
}'
 /etc/passwd

七、awk 循环

支持标准 for 循环,遍历字段

# 输出长度>=5的字段
awk -F: '{for(i=1;i<=NF;i++){if(length($i)>=5)print $i}}' /etc/passwd

八、awk 数组(统计神器)

支持数字/字符串下标,用于IP统计、访问统计、状态统计

# 统计各种shell数量
awk -F: '{sh[$7]++}END{for(i in sh)print i,sh[i]}' /etc/passwd

# 统计TCP连接状态
netstat -antp | awk '/^tcp/{status[$6]++}END{for(i in status)print i,status[i]}'

# 日志UV/访问量统计
awk '{uv[$1]++}END{for(i in uv)print i,uv[i]}' access.log

九、awk 内置函数

函数
作用
split(str,arr,sep)
分割字符串到数组
length(str)
字符串长度
substr(str,start,len)
截取子串
system(cmd)
执行系统命令
systime()
时间戳
strftime()
格式化时间
tolower()/toupper()
大小写转换

示例:

awk 'BEGIN{print length("linux")}'
awk 'BEGIN{print substr("hello",2,3)}'
awk 'BEGIN{system("hostname")}'
awk 'BEGIN{print strftime("%F %T")}'

核心要点总结

  1. awk 是逐行、分段处理的流式编程语言,运维必备。
  2. -F
    指定分隔符,$1~$n取字段,$0取整行。
  3. print
    简单打印,printf格式化输出,适合报表。
  4. 内置变量 NR/NF/FILENAME/FS/OFS大幅简化脚本。
  5. BEGIN/END
    是统计、输出表头表尾的标准结构。
  6. 支持if/for/数组,可实现复杂日志分析与计算。
  7. 数组是 awk 最强能力,用于UV、PV、连接状态、类型统计。
  8. 内置函数支持字符串、时间、系统调用,功能极丰富。

结尾互动

awk 是 Linux 文本处理的终极工具,掌握它,日志分析、数据统计、自动化运维效率直接翻倍!

如果这篇硬核干货对你有帮助,欢迎点赞、在看、转发给身边的运维伙伴,一起提升效率!

关注我,持续更新 Linux 运维、Shell 实战、awk/sed/grep 三剑客、自动化脚本等硬核内容,做最会用工具的高效运维人!

最新文章

随机文章