免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5680 | 回复: 5
打印 上一主题 下一主题

[文本处理] 把匹配的行输出给变量 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-06 12:26 |只看该作者 |倒序浏览
本帖最后由 alonerhu 于 2013-08-06 12:28 编辑

把监控程序从nrpe换成nsca后,受控端要主动发送数据。为了减少修改,写了个脚本直接读取原来的nrpe.cfg,执行命令后输出合适nsca的格式
现在有个行处理的问题:
初步输出如下:

  1. check_users
  2. USERS OK - 1 users currently logged in |users=1;10;20;0
  3. 0
  4. check_load
  5. OK - load average: 0.15, 0.13, 0.10|load1=0.150;15.000;30.000;0; load5=0.130;10.000;25.000;0; load15=0.100;5.000;20.000;0;
  6. 0
  7. check_disk_all
  8. DISK OK| /=845MB;3100;3487;0;3875 /opt=11329MB;23009;21798;0;24221 /var=1558MB;3100;3487;0;3875 /usr=5312MB;6200;6975;0;7750 /dev/shm=0MB;759;854;0;949 /mnt/itsupp=201934MB;241904;272142;0;302380 /var/ftp/pub/yum=201934MB;241904;272142;0;302380
  9. 0
  10. check_zombie_procs
  11. PROCS OK: 1 process with STATE = Z
  12. 0
复制代码
要交给nsca发送就要整理成整行,格式要求四个值用tab相隔,如这样子:
  1. "hostname"\t"check_users"\t"0"\t"USERS OK - 1 users currently logged in |users=1;10;20;0"
复制代码
可否直接从这个文件读取,把整行赋值给变量,构成:
  1. "HOSTNAME"\t"$CHECK_NAME"\t"$CHECK_STATUS"\t"$CHECK_OUTPUT"
复制代码
其中CHECK_NAME都是check_开头的

PS:我现在用的办法很笨拙,笨到我自己都觉得不好意思
1. 先把上面的结果按3行(check_开头)合并成一行,输出到新文本
  1. awk '/check_[a-z]*/{if (x)print x;x="";}{x=(!x)?$0:x" "$0;}END{print x;}' $COMMAND_RESULT > $COMMAND_RESULT.1
复制代码
2. 再反过来,逐行读取新文本分解成三个部分分别赋值
  1. cat $COMMAND_RESULT.1 | while read RESULT
  2. do
  3.     CHECK_NAME=`echo $RESULT | awk '{print $1}'`
  4.     CHECK_STATUS=`echo $RESULT | awk '{print $NF}'`
  5.     CHECK_OUTPUT=`echo $RESULT | awk '{$1="";$NF="";print}'`
  6.     echo -e "$HOSTNAME\t$CHECK_NAME\t$CHECK_STATUS\t$CHECK_OUTPUT" | $SENDER -c $CONFIG -H $NAGIOS > /dev/null
  7. done
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
2 [报告]
发表于 2013-08-06 12:33 |只看该作者
本帖最后由 rdcwayx 于 2013-08-06 14:34 编辑

办法笨没关系。先理解一下啥是 NRPE, NSCA

NRPE
NRPE is an addon that allows you to execute plugins on remote Linux/Unix hosts. This is useful if you need to monitor local resources/attributes like disk usage, CPU load, memory usage, etc. on a remote host. Similiar functionality can be accomplished by using the check_by_ssh plugin, although it can impose a higher CPU load on the monitoring machine - especially if you are monitoring hundreds or thousands of hosts.

The NRPE addon can be found on Nagios Exchange.

NSCA
NSCA is an addon that allows you to send passive check results from remote Linux/Unix hosts to the Nagios daemon running on the monitoring server. This is very useful in distributed and redundant/failover monitoring setups.

The NSCA addon can be found on Nagios Exchange.

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
3 [报告]
发表于 2013-08-06 12:44 |只看该作者
本帖最后由 rdcwayx 于 2013-08-06 14:47 编辑

  1. HOST=`hostname`
  2. awk -v host=$HOST 'BEGIN{RS="check_";FS="\n"}NR>1{print host, RS $1,$3,$2}' OFS="\t" $COMMAND_RESULT

  3. hostname       check_users     0       USERS OK - 1 users currently logged in |users=1;10;20;0
  4. hostname       check_load      0       OK - load average: 0.15, 0.13, 0.10|load1=0.150;15.000;30.000;0; load5=0.130;10.000;25.000;0; load15=0.100;5.000;20.000;0;
  5. hostname       check_disk_all  0       DISK OK| /=845MB;3100;3487;0;3875 /opt=11329MB;23009;21798;0;24221 /var=1558MB;3100;3487;0;3875 /usr=5312MB;6200;6975;0;7750 /dev/shm=0MB;759;854;0;949 /mnt/itsupp=201934MB;241904;272142;0;302380 /var/ftp/pub/yum=201934MB;241904;272142;0;302380
  6. hostname       check_zombie_procs      0       PROCS OK: 1 process with STATE = Z

复制代码

论坛徽章:
0
4 [报告]
发表于 2013-08-08 09:39 |只看该作者
多谢版主指点

我把nrpe换成nsca就是为了减轻nagios/icinga服务器端的负载

不过这里又有个新的问题:
我最终需要的还是成行的输出给send_nsca这个程序,如果不用以前的办法(输出到文件,循环读取行),是不是可以直接用awk把一行的结果输出到send_nsca

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
5 [报告]
发表于 2013-08-08 10:19 |只看该作者
是要这样吗?
  1. awk -v host=$HOST 'BEGIN{RS="check_";FS="\n"}NR>1{print host, RS $1,$3,$2}' OFS="\t" $COMMAND_RESULT |send_nsca
复制代码
还是这样:
  1. awk -v host=$HOST 'BEGIN{RS="check_";FS="\n"}NR>1{print host, RS $1,$3,$2}' OFS="\t" $COMMAND_RESULT |xargs send_nasca
复制代码

论坛徽章:
0
6 [报告]
发表于 2013-08-08 10:27 |只看该作者
本帖最后由 alonerhu 于 2013-08-08 14:15 编辑

版主好热情
我刚才也是这样子测试了下,似乎有点问题,现在有点别的事,等会我再试试看
  1. awk -v host=$HOST 'BEGIN{RS="check_";FS="\n"}NR>1{print host, RS $1,$3,$2}' OFS="\t" /tmp/nrpe_checks.result | /usr/sbin/send_nsca -c /etc/nagios/send_nsca.cfg -H 192.168.10.63
复制代码
这时候返回结果是:
21 data packet(s) sent to host successfully.
看起来是正确的
实际上服务器那边没有收到。

看来还是需要echo把处理结果发送给send_nsca,有点困惑,后面在慢慢测试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP