Shell脚本实现:根据服务器当前时间匹配CSV时间段提取TPS值
根据服务器时间匹配CSV时间区间行的脚本实现
核心需求
从包含StartTime,EndTime,TPS的CSV文件中,找出当前服务器时间处于StartTime和EndTime区间内的行,将该行写入单独文件,并从原CSV中移除该行。
优化当前时间获取
你原来的时间获取代码可以简化为更可靠的写法:
# 获取当前时间(HH:MM格式) TS=$(date +%H:%M) echo "Current time = $TS"
匹配目标行的核心代码
使用awk处理CSV是最便捷的方式,我们可以把时间转换为分钟数进行数值比较(避免字符串比较的潜在问题),同时完成匹配行输出和原文件更新:
# 定义文件路径(根据实际情况修改) CSV_FILE="tps_schedule.csv" TARGET_FILE="current_tps.csv" TEMP_FILE=$(mktemp) # 将当前时间转换为分钟数(比如11:35 → 11*60+35=695) current_minutes=$(echo "$TS" | awk -F: '{print $1*60 + $2}') # 用awk处理CSV,分离匹配行和非匹配行 awk -v current="$current_minutes" -F, ' # 保留表头到临时文件 NR == 1 { print > "'"$TEMP_FILE"'" ; next } { # 转换StartTime为分钟数 split($1, start, ":"); start_min = start[1]*60 + start[2] # 转换EndTime为分钟数 split($2, end, ":"); end_min = end[1]*60 + end[2] # 判断当前时间是否在[StartTime, EndTime)区间内(符合你示例中的逻辑) if (current >= start_min && current < end_min) { print > "'"$TARGET_FILE"'" } else { print > "'"$TEMP_FILE"'" } } ' "$CSV_FILE" # 备份原文件并替换为处理后的内容(防止数据丢失) mv "$CSV_FILE" "${CSV_FILE}.bak" && mv "$TEMP_FILE" "$CSV_FILE"
关键说明
- 时间转分钟数:把
HH:MM格式的时间转换成总分钟数,比如12:00→720,11:30→690,这样数值比较更直观,不会出现字符串比较的异常。 - 区间判断逻辑:
current >= start_min && current < end_min,符合你示例中11:35匹配11:30-12:00行的规则,12:00会匹配下一行12:00-12:45。 - 文件安全处理:先用
mktemp创建临时文件存储非匹配行,再备份原文件后替换,避免脚本出错导致数据丢失。
内容的提问来源于stack exchange,提问作者d_rulz
相关产品推荐
相关产品推荐

