所有,我使用以下代码在日志文件的最后几行中搜索一个词,以便在找到错误代码时(找到的行)发送该代码。由于该行(错误代码)未显示在何处,因此在将其作为文本执行后,我添加了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
答案 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次更改:
添加s
作为选项。这使得能够在节目内容之后处理开关。
双破折号--
终止选项处理。这告诉Perl,命令行上的不是 Perl选项。
-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的无用)。