https://mp.weixin.qq.com/s/VltHgnFqdtNfcQfHnIiaQA

高效运维 !!! 必备的7个文本技巧

快速查看日志中的某段内容

要从日志中提取包含特定字段的行,比如查看登录失败的日志行:

awk ‘/Failed password/ { print $0 }’ /var/log/secure

输出的内容会只包含关键字 Failed password 的行。/Failed password/ 是 AWK 的正则匹配语句,非常直观。

图片

统计某列出现的频率

在日志中,各种 IP、用户等字段频繁出现。通过以下命令,可以统计某字段(如 IP)出现的次数:

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
这个命令快速帮助运维定位频繁请求的来源。

计算总流量用量

图片
记录流量日志时,如果日志的第 10 列存储每个请求所消耗的流量字节数,可用以下命令计算总流量:

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” 4096
执行结果会是:

Total traffic: 0.000006 GB
这个方法对带宽监控特别有用。

分析日志文件中的用户行为

假如日志记录了登录失败的用户名和尝试的 IP,可以统计某用户被同一个 IP 破解过多少次:

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.1
输出结果可能是:

user1 192.168.0.1 2
user2 192.168.0.2 1
通过这个命令,可以直观地定位恶意攻击的目标用户和来源 IP。

一键格式化分散的服务状态

假如服务器的状态日志如下:

web01[192.168.0.1]
httpd ok
mysql ok
web02[192.168.0.2]
nginx ok
redis ok
你可以格式化输出所有服务绑定的主机:

awk ‘/^web/{hostname=$0;next}{print hostname, $0}’ services.lo
g
输出为:

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 100
输出结果为:

Alice 255 85
Bob 205 68.3333
Charlie 280 93.3333
这一命令对复杂报表分析也同样适用。

提取特定长度的单词

从句子中提取长度小于 6 的单词:

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
这个小技巧在处理文本数据时常常非常方便。

文档更新时间: 2025-07-31 07:10   作者:admin