Linux

將管道多行 grep 輸出擷取到變數中

  • June 9, 2015

我正在使用 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的輸出行擷取到變數中,以便我可以使用該變數作為參數呼叫另一個腳本?

問題是尾部;因為它處於連續模式,所以它永遠不會吐出一些東西供“閱讀”閱讀。

這應該有效:

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

引用自:https://serverfault.com/questions/586927