簡體   English   中英

Bash:將變量從函數添加到grep輸出

[英]Bash: Prepend variable from function to grep output

全部,我使用以下代碼在日志文件的最后幾行中搜索術語,以在發現錯誤時發送錯誤代碼(找到的行)。 由於該行(錯誤代碼)未顯示在何處,因此在將其作為文本執行后,我添加了OPERATION。

if tail -5 *logfile* | grep '*term*'; then
tail -5 *logfile* | grep '*term*' |  perl -ne 'print "OPERATION: $_"' | sendxmpp ...
fi

但是如何通過將OPERATION提供為變量($ 1)將其轉換為函數? 因為我經常在腳本中使用它。

#!/bin/sh
check_log () 
{
if tail -5 *logfile* | grep '*term*'; then
tail -5 *logfile* | grep '*term*' |  perl -ne 'print "$1: $_"' | sendxmpp ...
fi
}
check_log OPERATION

見下文。 您可以將shell變量( $1 )作為命名變量( prefix )傳遞給perl,然后可以在程序中引用它。

#!/bin/sh
check_log () {
    if tail -5 *logfile* | grep '*term*'; then
        tail -5 *logfile* | grep '*term*' |  perl -sne 'print "$prefix: $_"' -- -prefix=$1 | sendxmpp ...
    fi
}
check_log OPERATION

請注意,我對您的perl命令進行了3處更改:

  1. 添加s作為選項。 這使得能夠在節目內容之后處理開關。

  2. 雙破折號--終止選項處理。 這告訴Perl,命令行上的內容不是 Perl選項。

  3. -prefix=$1創建一個名為prefix的Perl變量,其值是外殼程序( $1 )傳遞給函數的第一個參數的擴展值。

免責聲明-我不是 Perl專家。 可能還有其他更好的方法可以做到這一點。 這只是我能夠做的一種方法。

首先,我懷疑您if應該在grep上使用-q標志。 (如果不是發送sendxmpp的管道,我也不會理會if。)

其次,我也不確定您要傳遞給grep的正則表達式。 似乎很難聞。

第三,我希望最好在sed中完成:

tail -5 *logfile* | grep '...' | sed -e 's/^/'"$1"': /' | sendxmpp ...

注意,相同的引用技巧也可以與perl一起使用。 如果參數中沒有空格或雙引號,則雙引號可能是多余的。

(我也將其歸類為grep的無用用法,只是在if和實際運行時中使用相同的regex引擎非常好。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM