如何对命令输出用循环与条件判断,打印LAG超1000的行?
我来帮你搞定这个需求,其实要实现「当LAG从0跃升到1000以上时打印对应行」,分两种场景:单次检查当前状态,或者持续监控状态变化。下面分别给出具体方案:
方案1:单次检查当前LAG超标的行
如果只是想一次性查看当前LAG超过1000的所有行,可以直接用awk组合命令,同时跳过非数字的表头行(如果输出有表头的话):
./mycommand --server 192.168.0.1:8080 --describe --group mygroup | awk '$5 ~ /^[0-9]+$/ && $5 > 1000 {print $0}'
解释下这个命令:
$5 ~ /^[0-9]+$/:确保第5列是纯数字,避免表头或异常行干扰$5 > 1000:筛选LAG值大于1000的行print $0:打印符合条件的整行内容
方案2:持续监控LAG从0到超1000的变化(更符合你的核心需求)
如果要捕捉LAG从0变为超过1000的瞬间,就需要持续轮询命令输出,对比每个条目(按TOPIC+PARTITION区分)的历史LAG状态。可以写一个Shell脚本来实现:
#!/bin/bash # 用关联数组存储每个TOPIC-PARTITION的历史LAG值 declare -A last_lag # 循环间隔(单位:秒),可根据需求调整 CHECK_INTERVAL=10 while true; do # 执行命令并跳过表头行(如果你的输出第一行是表头,就保留tail -n +2;否则删掉) ./mycommand --server 192.168.0.1:8080 --describe --group mygroup | tail -n +2 | while read -r full_line; do # 提取LAG值和唯一标识(用TOPIC+PARTITION组合,避免不同条目混淆) current_lag=$(echo "$full_line" | awk '{print $5}') entry_key=$(echo "$full_line" | awk '{print $1 "-" $2}') # 先验证当前LAG是有效数字 if [[ "$current_lag" =~ ^[0-9]+$ ]]; then # 判断:当前LAG>1000,且之前的状态是0(或从未记录过) if [[ "$current_lag" -gt 1000 && ( "${last_lag[$entry_key]}" -eq 0 || -z "${last_lag[$entry_key]}" ) ]]; then echo "$(date '+%Y-%m-%d %H:%M:%S') - LAG从0跃升至超过1000: $full_line" fi # 更新当前条目的历史LAG值 last_lag[$entry_key]="$current_lag" fi done # 等待指定间隔后再检查 sleep "$CHECK_INTERVAL" done
使用方法:
- 将脚本保存为
monitor_lag.sh - 赋予执行权限:
chmod +x monitor_lag.sh - 运行脚本:
./monitor_lag.sh
这个脚本的优势:
- 用
entry_key区分不同的TOPIC-PARTITION,不会混淆不同条目 - 记录每个条目的历史LAG值,只在「从0变到超1000」时触发打印,避免重复输出
- 带时间戳,方便排查问题
- 可调整检查间隔,平衡实时性和资源占用
内容的提问来源于stack exchange,提问作者Jaydeep Chaudhari
相关产品推荐
相关产品推荐

