背影:因为每天需要巡检磁盘的剩余大小,但是有时候有些服务器会采集不到磁盘的信息,因为数量比较多所以就不容易发现是那个服务器的数据没采集到,所以就写了这个脚本,下面记录分享一下awk和grep的几个参数的用法。

这个脚本的思路就是,先把全部的IP放在本地的一个文件里面,然后连接到数据库把数据取出来后存到一个文件,在用grep把没有出现过的IP输出到一个文件。在写的过程中,看着都正确但是没有对比结果出来,经测试发现是因为有空格和空行导致。

#!/bin/bash  
QUERY="select collecter_ip from XUNJIAN where time > (SELECT current_timestamp - interval ' 11 hours')  group by collecter_ip;" # 查询语句  
QUERY2="select collecter_ip,max(maxdisk) as dd from XUNJIAN where time > (SELECT current_timestamp - interval ' 11 hours') group by collecter_ip order by dd desc;"
OUTPUT_FILE="db_output.txt"
LOCAL_FILE="local_file.txt"
RESULT_FILE="result.txt"
#查询生成可以检测磁盘的ip
psql -U icp -h 2409:801e:5a03::311 -p 1521 -d icpdb -t -c "${QUERY}" > ${OUTPUT_FILE}  
#去除空格和空行
awk -i inplace '{gsub(/^[ \t]+|[ \t]+$/, ""); if (length($0) > 0) print}' ${OUTPUT_FILE}
psql -U icp -h 2409:801e:5a03::311 -p 1521 -d icpdb -t -c "${QUERY2}" > ${RESULT_FILE}

echo "未被监测到的主机:" >> ${RESULT_FILE}
#进行比对
grep -vFf  ${OUTPUT_FILE} ${LOCAL_FILE} >> ${RESULT_FILE}
#需要在单独执行一遍查询磁盘的sql生成一个文件  
# 删除临时文件(如果需要)  
rm ${OUTPUT_FILE}

#去除空格和空行
awk -i inplace '{gsub(/^[ \t]+|[ \t]+$/, ""); if (length($0) > 0) print}' ${OUTPUT_FILE}

这个主要用到的参数是 -i inplace,这个参数可以直接在原文件上进行修改。

#进行比对
grep -vFf  ${OUTPUT_FILE} ${LOCAL_FILE} >> ${RESULT_FILE}

grep用到的主要是 vfF这三个参数,下方是这三个参数的解释(我搬运的)

  1. -v:反向选择,即显示不匹配指定模式的行。换句话说,它会过滤掉包含指定模式的行,而只显示不包含该模式的行。
  2. -f FILE:从FILE中取得模式,即把FILE中的内容作为模式来搜索。这通常用于将多个模式存储在一个文件中,并一次性在目标文件中搜索这些模式。
  3. -F:将模式视为固定字符串而非正则表达式。这意味着grep会按照字面意义来匹配字符串,而不是尝试将其解析为正则表达式。这在搜索不包含特殊字符的字符串时很有用,因为它可以提高搜索速度并避免由于正则表达式解析导致的错误。