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