
高效运维 !!! 必备的7个文本技巧
2025年08月21日 21:01
以下文章来源于开源运维 ,作者开源运维
开源运维 如果你是一名运维工程师,AWK 是你的利器之一。它简单高效,专为文本处理和数据分析设计。从日志分析到报表生成,无所不能。以下总结了一些运维中最常用的 AWK 技巧,助你大幅提升工作效率。 要从日志中提取包含特定字段的行,比如查看登录失败的日志行: 输出的内容会只包含关键字 在日志中,各种 IP、用户等字段频繁出现。通过以下命令,可以统计某字段(如 IP)出现的次数: 假如 输出统计结果可能类似: 这个命令快速帮助运维定位频繁请求的来源。 记录流量日志时,如果日志的第 10 列存储每个请求所消耗的流量字节数,可用以下命令计算总流量: 如果运行该命令,假设流量数据是以下示例: 执行结果会是: 这个方法对带宽监控特别有用。 假如日志记录了登录失败的用户名和尝试的 IP,可以统计某用户被同一个 IP 破解过多少次: 例如日志内容如下: 输出结果可能是: 通过这个命令,可以直观地定位恶意攻击的目标用户和来源 IP。 假如服务器的状态日志如下: 你可以格式化输出所有服务绑定的主机: 输出为: 这种格式化处理方便数据生成报表或批量检查。 运维中偶尔需要处理一些报表,如计算每个同学的总分和平均分: 若 输出结果为: 这一命令对复杂报表分析也同样适用。 从句子中提取长度小于 6 的单词: 假设 输出结果为: 这个小技巧在处理文本数据时常常非常方便。 AWK 是运维人员的好帮手,不仅操作简单,还能应对复杂场景。掌握这些基础技巧后,你可以结合具体需求自行扩展使用,轻松实现自动化的数据处理。快速查看日志中的某段内容
awk '/Failed password/ { print $0 }' /var/log/secure
Failed password
的行。/Failed password/
是 AWK 的正则匹配语句,非常直观。统计某列出现的频率
awk '{counts[$1]++} END {for (ip in counts) print ip, counts[ip]}' access.log | sort -nrk2 | head
access.log
日志内容格式如下:192.168.0.1 - "GET /index.html"
192.168.0.2 - "GET /contact.html"
192.168.0.1 - "POST /login"116.198.58.87 11857
116.198.58.90 11793
116.198.48.20 3045
116.198.48.23 3010
116.198.48.27 3005
116.198.48.19 3002
116.198.48.16 2992
116.198.48.31 2989
116.198.48.24 2954
116.198.48.28 2760计算总流量用量
awk '{sum+=$10} END {print "Total traffic:", sum/1024^3, "GB"}' access.log
192.168.0.1 - "GET /index.html" 2048
192.168.0.2 - "GET /about.html" 1024
192.168.0.1 - "POST /login" 4096Total traffic: 0.000006 GB
分析日志文件中的用户行为
awk '/Failed password/ {failed[$(NF-5)" "$(NF-3)]++} END {for (key in failed) print key, failed[key]}' /var/log/secure | sort -nrk2
Failed password for user1 from 192.168.0.1
Failed password for user2 from 192.168.0.2
Failed password for user1 from 192.168.0.1user1 192.168.0.1 2
user2 192.168.0.2 1一键格式化分散的服务状态
web01[192.168.0.1]
httpd ok
mysql ok
web02[192.168.0.2]
nginx ok
redis okawk '/^web/{hostname=$0;next}{print hostname, $0}' services.log
web01[192.168.0.1] httpd ok
web01[192.168.0.1] mysql ok
web02[192.168.0.2] nginx ok
web02[192.168.0.2] redis ok计算学生成绩的总分与平均分
awk '{sum=0; for(i=2; i<=NF; i++) sum+=$i; avg=sum/(NF-1); print $1, sum, avg}' scores.txt
scores.txt
内容如下:Alice 90 85 80
Bob 70 75 60
Charlie 95 85 100Alice 255 85
Bob 205 68.3333
Charlie 280 93.3333提取特定长度的单词
awk 'BEGIN {RS="[ ,.!?]+"} length($0) < 6 {print $0}' text.txt
text.txt
内容为:I am a Linux administrator, and I love AWK.
I
am
a
Linux
and
I
AWK