shell高级编程练习题实现系统日志错误分析
基础代码:这里用了awk匹配文件第七列(测试文件里第七列是错误种类),不太安全,文件必须严格按照这种排列方式才能成功统计,更好的做法是注释掉awk部分,在-E后添加o选项,表示只输出匹配到的部分,更安全。Ⅲ我开始细看代码,是vim编辑器中的高亮显示提醒了我,这里的sore都是黄色,uniq却没有变色,而且uniq结尾的反斜杠是白色的,不同于其他行黄色的反斜杠。代码的uniq这一行报错了,提示我找不
题目2:分析系统日志,提取并分类错误信息,按严重级别统计。
测试数据(保存为 syslog.txt):
Jan 26 08:12:34 server kernel: CRITICAL: Memory allocation failed, system unstable
Jan 26 08:15:22 server sshd[1234]: ERROR: Authentication failed for user root from 192.168.1.100
Jan 26 08:18:05 server cron[5678]: WARNING: Crontab file has incorrect permissions
Jan 26 08:20:11 server apache2[9012]: ERROR: Failed to start Apache service
Jan 26 08:22:45 server mysqld[3456]: WARNING: InnoDB buffer pool size is too small
Jan 26 08:25:33 server kernel: CRITICAL: Disk /dev/sda1 is 98% full
Jan 26 08:28:17 server sshd[7890]: ERROR: Maximum authentication attempts exceeded
Jan 26 08:30:09 server nginx[2345]: WARNING: Invalid SSL certificate configured
Jan 26 08:33:21 server systemd[4567]: ERROR: Failed to mount /mnt/backup
Jan 26 08:35:44 server kernel: CRITICAL: CPU temperature exceeds threshold (95°C)
1.题目分析:题目要求将不同等级的错误归类排列,最后统计次数,输出信息。
2.接下来分布实现以上功能。
基础代码:这里用了awk匹配文件第七列(测试文件里第七列是错误种类),不太安全,文件必须严格按照这种排列方式才能成功统计,更好的做法是注释掉awk部分,在-E后添加o选项,表示只输出匹配到的部分,更安全。
grep -E "(CRITICAL|ERROR|WARNING)" syslog.txt | \
awk '{print $7}' | \
sed 's/://g' | \
sort | \
uniq -c | \
sort -nr
①按错误级别分组,给出详细错误信息:
利用扩展正则表达式,在测试文件中找出包含CRITICAL、ERROR、WARNING的行,通过管道传递最终实现按出现次数降序排序(也可以不降序处理,注释掉uniq后的内容即可)

代码的uniq这一行报错了,提示我找不到命令,问了ai可能出现的问题后,我开始验证几种可能的情况。
![]()
Ⅰ命令不存在,uniq依赖库可能被误删(coreutils包),which uniq后正常输出路径说明uniq路径存在,不是这个问题,事后回想sort也属于coreutils包却没有报错也验证了这一点。
Ⅱ环境变量PATH出了问题,于是我在代码uniq前加入绝对路径:
/usr/bin/uniq -c | \
依旧报一样的错,也不是这个问题。
Ⅲ我开始细看代码,是vim编辑器中的高亮显示提醒了我,这里的sore都是黄色,uniq却没有变色,而且uniq结尾的反斜杠是白色的,不同于其他行黄色的反斜杠![]()
这就是问题所在。
Ⅳ注意:反斜杠\后不能接注释或空格,否则会失效,系统就会把这一行当成完整命令。下一行的 uniq 命令变成独立的行,但行首的空格会被误判,导致命令不完整 ,出现command not found的错误。此处仅作学习需要,我在代码中贪心地写上了注释,本意是方便理解,反而给自己造了麻烦。
②按错误级别分类显示,循环遍历三种错误级别,用替换命令删除错误级别之前的内容,只保留错误详情。此处要注意单引号里的变量不会被解析,双引号里的变量会被解析。
for level in CRITICAL ERROR WARNING; do
echo -e "\n[$level]:"
grep "$level:" syslog.txt | sed "s/^.*$level: / /"
done
3.脚本运行结果:符合题目要求。

更多推荐


所有评论(0)