Bash脚本处理SQL多行两列结果:循环遍历与定时执行需求
修正Bash脚本遍历SQL多行查询结果的逻辑
我正在编写包含SQL查询的Bash脚本,该查询返回多行两列数据,示例输出如下:
|db_name | used_% | |--------|--------| |row 1 |29% | |row 2 |45% | |row 3 |60% |依此类推。我需要遍历每一行,将db_name和对应的used_%分别存入变量,同时让脚本每10秒执行一次。目前我的代码将db_name和used_%存入了单个变量,代码如下:
#!/bin/bash while : do QUERY=$("select db_name, used_% from Table1;") DBNAME=$(echo "$QUERY" | cut -d"|" -f1) USED_PERCENT=$(echo "$QUERY" | cut -d"|" -f2) echo "PUTVAL \'$DBNAME'/gauge-used_percent\" interval 10 N:${USED_PERCENT#"${USED_PERCENT%%[!:space:]]*}"}" sleep 10 done希望有人能帮忙修正循环遍历db_name和used_%的逻辑。感谢!
修正后的脚本
#!/bin/bash # 无限循环,每10秒执行一次查询 while : do # 替换为你的实际SQL执行命令(比如mysql/psql等),跳过前两行表头和分隔线 mysql -u your_username -p'your_password' -D your_database -e "select db_name, used_% from Table1;" | tail -n +3 | # 逐行分割处理数据 while IFS='|' read -r _ db_name used_percent _; do # 清理字段前后空格,去除百分比符号 cleaned_db=$(echo "$db_name" | xargs) cleaned_used=$(echo "$used_percent" | xargs | tr -d '%') # 输出符合要求的PUTVAL指令 echo "PUTVAL '$cleaned_db'/gauge-used_percent interval 10 N:$cleaned_used" done sleep 10 done
核心修正说明
- 跳过无效行:用
tail -n +3过滤掉查询结果的前两行(表头和分隔线),只处理实际数据行 - 逐行读取字段:通过
while IFS='|' read -r _ db_name used_percent _按|分割每行,_用来忽略每行首尾的空字段(因为每行以|开头和结尾) - 数据清洗:用
xargs去除字段前后的空格,tr -d '%'剥离百分比符号,保证变量值格式符合后续使用要求 - 修正SQL执行方式:原代码中直接用
QUERY=$("select ...")无法执行SQL,需要替换为对应数据库客户端的执行命令(示例用mysql,可根据实际情况换成psql等)
内容的提问来源于stack exchange,提问作者skasar
相关产品推荐
相关产品推荐

