捕获pipe道多行grep输出到一个variables

我使用Zabbix的zabbix_sender.sh脚本将exception堆栈跟踪推送到远程Zabbix监视服务器。

zabbix_sender.sh需要一个键和它发送的任何数据的值。 它可以从stdin读取数据,但是这会覆盖指定的任何关键variables。 因为我的stdin数据不像Zabbix所期望的那样格式化,所以我需要传入“值”作为参数。 希望这提供了一些上下文。

我想要完成的是将grep的多行结果捕获到一个variables中,保留换行符,以便我可以用该variables作为参数调用zabbix_sender.sh脚本。

我到目前为止所尝试的是这样的:

tail -Fn0 /var/log/uwsgi.log | grep "Exception:" -A 100 | (read tback; /usr/local/zabbix/bin/zabbix_sender -z myzserver.com -s MyHostName -k uwsgi_traceback -o $tback)

尽我所知,从来没有调用zabbix_sender.sh

为了testing,我试过使用这个命令,这似乎也不工作:

tail -Fn0 /var/log/uwsgi.log | grep "Exception:" -A 100 | (read errorlines; echo "$errorlines" > /tmp/errorlines.txt)

/tmp/errorlines.txt文件永远不会被创build。

如何将grep的输出行捕获到一个variables中,以便我可以用该variables调用另一个脚本作为参数?

问题是尾巴部分; 因为它处于连续模式,所以不会吐出“读”的东西来读。

这应该工作:

 #!/bin/bash echo "0" >/tmp/numberoflines IFS='' while [ 1 ] do NUMBER=$(cat /tmp/numberoflines) LINES=$(wc -l < /var/log/uwsgi.log) DIFFERENCE=$(($LINES-$NUMBER)) if [ $DIFFERENCE != 0 ]; then exception=$(tail -n $DIFFERENCE /var/log/uwsgi.log | grep "Exception:" -A 100) /zabbix/bin/zabbix_sender -z myzserver.com -s MyHostName -k uwsgi_traceback -o $tback) $exception; fi sleep 5; echo "$LINES" >/tmp/numberoflines done 

在这里我的做法。

  1. 使用zabbix“log”types键监视日志文件中的错误模式(这里是/var/log/uwsgi.log)。
  2. 调用上面触发的zabbix远程命令1.这个远程命令通过linux命令tail(1)获取错误周围的错误。

这种方法的优点是:

  1. 无需安装&设置代理 – 主机端特殊脚本(如上面讨论的zabbix_sender.sh)。 zabbix的“日志”types的项目已经提供了这样一种目的。
  2. 代理主机上没有zabbix_sender.sh类似的脚本,意味着没有额外的CPU和内存消耗。 在日志中获取几行超过错误的行只发生在触发器上。

让我来解释一下如何设置的细节:

  1. 在“pipe理”>“常规”>“正则expression式”>“新正则expression式”(如“错误|失败|致命”)中注册zabbix中的正则expression式。 假设variables名是@uwsgi_error_pattern。
  2. 从configuration>主机> [目标主机]行>项目> [创build项目]中注册项目,具有以下属性:
    • 描述:[任何名字]
    • types:Zabbix代理(主动)
    • 密钥:log [/var/log/uwsgi.log,@uwsgi_error_pattern]
    • 信息types:日志
  3. 使用以下属性注册configuration>主机> [目标主机]行>项目> [创build项目]中的第二个项目,以接受由zabbix远程命令(稍后提及)发送的获取的日志标记:
    • 描述:[任何名字]
    • types:Zabbix捕手
    • 键:my_app.fetch_uwsgi_log
    • 信息types:文本
  4. 从configuration>主机> [目标主机]行>触发器> [创build触发器]中使用以下属性注册触发器:
    • 名称:{HOSTNAME}中的uwsgi日志监视器
    • expression式({[Target host]:log [/var/log/uwsgi.log,@uwsgi_error_pattern] .iregexp(@uwsgi_error_pattern)})#0&({[Target host]:log [/var/log/uwsgi.log, @uwsgi_error_pattern] .nodata(300)})= 0
  5. 注册操作,远程执行以获取围绕日志文件错误行的数据,如下所示:
    • 名称:获取最新的uwsgilogin错误
    • 行动行动:
      • 操作types:远程命令
      • 远程命令:{HOSTNAME}:zabbix_sender -z [zabbix-server] -s {HOSTNAME} -k my_app.fetch_uwsgi_log -o“`tail -200 / var / log / uwsgi.log`”

注1:上述步骤中的密钥名称“my_app.fetch_uwsgi_log”就是例子。 我们可以定义任何唯一的名字来绑定zabbix_sender和项目。

注2:您可能需要/etc/zabbix/zabbix_agentd.conf上的AllowRoot = 1来允许zabbix-agent读取uwsgi.log。

您必须closuresbash中的单词分割 ,例如通过清除IFS:

 export IFS="" set NEWVAR=`your tail|grep expression` 

现在echo $NEWVAR有换行符。