Linux
將管道多行 grep 輸出擷取到變數中
我正在使用 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