news 2026/4/7 2:25:49

awk文本处理相关练习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
awk文本处理相关练习

练习1要求:

1、检测两台服务器指定目录下的文件一致性 #!/bin/bash ##################################### #检测两台服务器指定目录下的文件一致性 ##################################### #通过对比两台服务器上文件的md5值,达到检测一致性的目的 dir=/data/web b_ip=192.168.88.10 #将指定目录下的文件全部遍历出来并作为md5sum命令的参数,进而得到所有文件的md5值,并写入到指定文件中

代码及结果演示:

两边文件内容不一样符合预期

练习2:

#!/bin/bash
################################################################
#每小时执行一次脚本(任务计划),当时间为0点或12点时,将目标目录下的所有文件内
#容清空,但不删除文件,其他时间则只统计各个文件的大小,一个文件一行,输出到以时#间和日期命名的文件中,需要考虑目标目录下二级、三级等子目录的文件
################################################################、

代码和结果:

练习3:

#!/bin/bash
#######################################################
#检测网卡流量,并按规定格式记录在日志中
#规定一分钟记录一次
#日志格式如下所示:
#2019-08-12 20:40
#ens33 input: 1234bps
#ens33 output: 1235bps
######################################################

练习4:

#!/bin/bash ######################################################### #计算文档每行出现的数字个数,并计算整个文档的数字总数 ######################################################## #使用awk只输出文档行数(截取第一段)

练习5:

#场景:
#1.访问日志文件的路径:/data/log/access.log
#2.脚本死循环,每10秒检测一次,10秒的日志条数为300条,出现502的比例不低于10%(30条)则需要重启php-fpm服务
#3.重启命令为:/etc/init.d/php-fpm restart
#!/bin/bash
###########################################################
#监测Nginx访问日志502情况,并做相应动作
###########################################################

因为启动条件不好复现,这里我们选择使用脚本模拟

模拟脚本:

#!/bin/bash
# 生成502错误日志脚本 - 基本版

LOG_FILE="access.log"
TOTAL_ENTRIES=10000 # 要生成的日志条目数
RATE_PER_SECOND=100 # 每秒生成多少条

echo "开始向 $LOG_FILE 生成 502 错误日志..."
echo "总计: $TOTAL_ENTRIES 条"
echo "速率: $RATE_PER_SECOND 条/秒"

# 清空或创建日志文件
> "$LOG_FILE"

# IP地址池
IP_POOL=(
"192.168.1."
"10.0.0."
"172.16.1."
"203.0.113."
"198.51.100."
)

# User-Agent池
USER_AGENTS=(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15"
"Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36"
"curl/7.68.0"
"PostmanRuntime/7.26.8"
)

# HTTP方法
METHODS=("GET" "POST" "PUT" "DELETE" "HEAD")

# 请求路径
PATHS=(
"/api/v1/users"
"/admin/login"
"/products/list"
"/search"
"/images/logo.png"
"/static/js/main.js"
"/wp-admin/"
"/phpmyadmin/"
)

generate_log_entry() {
local timestamp=$(date '+%d/%b/%Y:%H:%M:%S %z')

# 随机IP (192.168.1.100-200)
local ip_prefix=${IP_POOL[$((RANDOM % ${#IP_POOL[@]}))]}
local ip_suffix=$((RANDOM % 100 + 100))
local ip="${ip_prefix}${ip_suffix}"

# 随机用户名(有时为-)
local user="-"
if [ $((RANDOM % 4)) -eq 0 ]; then
user="admin"
fi

local method=${METHODS[$((RANDOM % ${#METHODS[@]}))]}
local path=${PATHS[$((RANDOM % ${#PATHS[@]}))]}

# 随机HTTP版本
local http_version="HTTP/1.1"
if [ $((RANDOM % 5)) -eq 0 ]; then
http_version="HTTP/2"
fi

# 状态码:主要生成502,偶尔其他错误码
local status_code="502"
if [ $((RANDOM % 10)) -eq 0 ]; then
# 偶尔生成其他错误码
case $((RANDOM % 5)) in
0) status_code="500" ;;
1) status_code="503" ;;
2) status_code="504" ;;
3) status_code="404" ;;
4) status_code="403" ;;
esac
fi

local bytes=$((RANDOM % 4096))
local referer="-"
if [ $((RANDOM % 3)) -eq 0 ]; then
referer="https://example.com/page$((RANDOM % 10)).html"
fi

local user_agent=${USER_AGENTS[$((RANDOM % ${#USER_AGENTS[@]}))]}

echo "$ip - $user [$timestamp] \"$method $path $http_version\" $status_code $bytes \"$referer\" \"$user_agent\""
}

# 生成日志
for ((i=1; i<=TOTAL_ENTRIES; i++)); do
generate_log_entry >> "$LOG_FILE"

# 控制生成速率
if [ $((i % RATE_PER_SECOND)) -eq 0 ] && [ $i -lt $TOTAL_ENTRIES ]; then
sleep 1
echo -ne "已生成: $i/$TOTAL_ENTRIES 条日志\r"
fi
done

echo ""
echo "完成!已在 $LOG_FILE 中生成 $TOTAL_ENTRIES 条日志"
echo "其中约 90% 为 502 错误"

测试脚本结果

测试结果:

练习6:

扫描主机端口状态

代码和结果:

练习7:

创建10个用户,并分别设置密码,密码要求10位且包含大小写字母以及数字, 最后需要把每个用户的密码存在指定文件中。

代码和结果:

创建的用户

练习8:

批量修改服务器用户密码 Linux主机SSH连接信息:旧密码 # cat old_pass.txt 192.168.18.217 root 123456 22 192.168.18.218 root 123456 22 内容格式:IP User Password Port SSH远程修改密码脚本:新密码随机生成

服务器原文件展示

安装必要令 expect + mkpasswd

结果

代码

注意:新版本rehl不支持 mkpasswd-l 指令

练习9::查看CPU资源占用率的脚本文件

结果:

代码其一:

代码其二:

练习10:

生成磁盘使用情况的日志文件

代码和结果

日志文件展示:

练习11:

#!/bin/bash
#######################################################################################
#需求:
#1.每隔10s监控httpd的进程数,若进程数大于等于500,则自动重启Apache服务,并检测服务是否重启成功
#2.若未成功则需要再次启动,若重启5次依旧没有成功,则向管理员发送告警邮件,并退出检测
#3.如果启动成功,则等待1分钟后再次检测httpd进程数,若进程数正常,则恢复正常检测(10s一次),否则放弃重启并向管理员发送告警邮件,并退出检测
#######################################################################################

代码展示:

阈值为500个进程

练习12:

根据web访问日志,封禁请求量异常的IP,如IP在半小时后恢复正常,则解除封禁

制造一个测试文件

代码展示:

运行代码:

因为无请求超过100次的ip所以无结果

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/29 22:46:35

嵌入式系统中I2C多主设备部署实践

嵌入式系统中 I2C 多主设备部署&#xff1a;从原理到实战的完整指南在一块小小的嵌入式电路板上&#xff0c;多个微控制器&#xff08;MCU&#xff09;共享同一组 I2C 总线通信&#xff0c;听起来像是高效协同的设计。但如果你经历过总线“死锁”、数据错乱、任务莫名卡顿——那…

作者头像 李华
网站建设 2026/4/5 17:03:25

u8g2驱动适配常见问题解析:快速理解底层机制

u8g2驱动适配实战指南&#xff1a;从“点不亮屏”到精通底层通信你有没有遇到过这样的场景&#xff1f;硬件接线确认无误&#xff0c;代码编译通过&#xff0c;下载运行后OLED却一片漆黑——既不是显示内容错了&#xff0c;也不是花屏&#xff0c;而是完全没反应。反复检查IC地…

作者头像 李华
网站建设 2026/4/6 12:28:03

无需修改代码:如何用TensorRT插件式接入现有AI系统?

无需修改代码&#xff1a;如何用TensorRT插件式接入现有AI系统&#xff1f; 在当今高并发、低延迟的AI服务场景中&#xff0c;一个常见的困境是&#xff1a;模型已经训练得足够准确&#xff0c;业务逻辑也已稳定运行&#xff0c;但面对不断增长的请求量&#xff0c;推理性能却成…

作者头像 李华
网站建设 2026/3/27 18:44:36

Keil调试教程:STM32实时变量监控方法

Keil调试实战&#xff1a;手把手教你精准监控STM32运行时变量 你有没有遇到过这样的场景&#xff1f; PID控制输出突然震荡&#xff0c;但串口打印的日志却风平浪静&#xff1b;DMA传输的数据莫名其妙被覆盖&#xff0c;翻遍代码也找不到源头&#xff1b;某个全局标志位在中断…

作者头像 李华
网站建设 2026/4/1 19:17:02

快速理解STM32F4固件包结构与用途

深入理解STM32F4固件包&#xff1a;从结构到实战的完整指南 在嵌入式开发的世界里&#xff0c;时间就是竞争力。当你拿到一块崭新的STM32F4开发板&#xff0c;面对密密麻麻的引脚和复杂的外设手册时&#xff0c;是否曾感到无从下手&#xff1f;如何在最短时间内点亮LED、串口打…

作者头像 李华