AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 586927
Accepted
skyler
skyler
Asked: 2014-04-06 08:49:13 +0800 CST2014-04-06 08:49:13 +0800 CST 2014-04-06 08:49:13 +0800 CST

将管道多行 grep 输出捕获到变量中

  • 772

我正在使用 Zabbix 的zabbix_sender.sh脚本将异常堆栈跟踪推送到我的远程 Zabbix 监控服务器。

zabbix_sender.sh它发送的任何数据都需要一个键和一个值。它可以从 读取数据stdin,但这会覆盖任何指定的键变量。因为我的stdin数据没有像 Zabbix 期望的那样格式化,所以我需要传入“值”作为参数。希望这提供了一些背景信息。

我想要完成的是将多行结果捕获grep到一个变量中,保留换行符,以便我可以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.

为了测试,我试过使用这个命令,它似乎也不起作用:

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

永远不会创建该/tmp/errorlines.txt文件。

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

linux
  • 3 3 个回答
  • 5488 Views

3 个回答

  • Voted
  1. Fumisky Wells
    2015-06-09T00:26:37+08:002015-06-09T00:26:37+08:00

    这是我的方法。

    1. 使用 zabbix "log" 类型键来监控日志文件中的错误模式(/var/log/uwsgi.log 就是这种情况)。
    2. 调用上述触发的zabbix远程命令 1.这个远程命令通过linux命令tail(1)获取错误周围的行。

    这种方法的优点是:

    1. 无需安装和设置代理主机端特殊脚本(如上面讨论的 zabbix_sender.sh)。zabbix 'log' 类型的项目已经提供了这样一种用途。
    2. 代理主机上没有类似 zabbix_sender.sh 的脚本意味着没有额外的 CPU 和内存消耗。在日志中获取围绕错误的几行仅在触发时发生。

    让我在下面解释如何设置的详细信息:

    1. 在 zabbix 中注册正则表达式,从 Administration > General > Regular expressions > [New regular expression] like "error|fail|fatal"。假设变量名是@uwsgi_error_pattern。
    2. 从 Configuration > Hosts > [Target host] line > Items > [Create Item] 注册项目,并具有以下属性:
      • 描述:[任何名称]
      • 类型:Zabbix 代理(主动)
      • 键:日志[/var/log/uwsgi.log,@uwsgi_error_pattern]
      • 信息类型:日志
    3. 从 Configuration > Hosts > [Target host] line > Items > [Create Item] 中注册第二项具有以下属性,以接受 zabbix 远程命令发送的获取日志标志(稍后提到):
      • 描述:[任何名称]
      • 类型:Zabbix 陷阱
      • 键:my_app.fetch_uwsgi_log
      • 信息类型:文本
    4. 从 Configuration > Hosts > [Target host] line > Triggers > [Create trigger] 注册触发器,具有以下属性:
      • 名称:{HOSTNAME} 上的 uwsgi 日志监视器
      • 表达式 ({[目标主机]:log[/var/log/uwsgi.log,@uwsgi_error_pattern].iregexp(@uwsgi_error_pattern)})#0&({[目标主机]:log[/var/log/uwsgi.log, @uwsgi_error_pattern].nodata(300)})=0
    5. 注册操作远程执行以获取日志文件错误行周围的数据,如下所示:
      • 名称:获取最新的 uwsgi 登录错误
      • 动作操作:
        • 操作类型:远程命令
        • 远程命令:{HOSTNAME}:zabbix_sender -z [zabbix-server] -s {HOSTNAME} -k my_app.fetch_uwsgi_log -o "`tail -200 /var/log/uwsgi.log`"

    NOTE-1:上述步骤中的键名“my_app.fetch_uwsgi_log”只是示例。我们可以定义任何唯一的名称来绑定 zabbix_sender 和 item。

    NOTE-2:您可能需要在 /etc/zabbix/zabbix_agentd.conf 上设置 AllowRoot=1 以允许 zabbix-agent 读取 uwsgi.log。

    • 2
  2. mkaama
    2014-04-06T09:16:05+08:002014-04-06T09:16:05+08:00

    您必须在 bash 中关闭分词,例如,通过清除 IFS:

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

    现在echo $NEWVAR有了换行符。

    • 1
  3. Best Answer
    metacom
    2014-04-06T12:15:13+08:002014-04-06T12:15:13+08:00

    问题是尾部;因为它处于连续模式,所以它永远不会吐出一些东西供“阅读”阅读。

    这应该有效:

    #!/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

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve