![](/img/trans.png)
[英]Prepend output from each function named in a bash array with an echo?
[英]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處更改:
添加s
作為選項。 這使得能夠在節目內容之后處理開關。
雙破折號--
終止選項處理。 這告訴Perl,命令行上的內容不是 Perl選項。
-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.