Bash:将变量从函数添加到grep输出

时间:2019-01-22 20:42:31

标签: bash perl

所有,我使用以下代码在日志文件的最后几行中搜索一个词,以便在找到错误代码时(找到的行)发送该代码。由于该行(错误代码)未显示在何处,因此在将其作为文本执行后,我添加了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

2 个答案:

答案 0 :(得分:2)

请参阅下文。您可以将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专家。可能还有其他更好的方法可以做到这一点。这只是我能够做的一种方法。

答案 1 :(得分:0)

首先,我怀疑您的if应该在-q上使用grep标志。 (如果不是通过管道发送sendxmpp,我也不会理会if。)

第二,我也不确定您要传递给grep的正则表达式。看起来像是鱼腥。

第三,我希望在sed中做得更好:

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

请注意,相同的引用技巧也可以与perl一起使用。如果参数中没有空格或双引号,则双引号可能是多余的。

(除了将if和实际运行时都使用相同的regex引擎很好,我还将其归类为grep的无用)。