读取消息的 unix 日志,然后执行操作

Read unix log for message and then perform action

我想创建一个 shell 脚本来读取消息日志,并在找到正确的字符串时执行操作。到目前为止,我有以下内容:

#!/bin/bash
string="ntp engine ready"
tail -n 0 -f /var/log/messages | \
while read LINE
do
echo "$LINE | grep -q $string"
if [ $? == 0];then
shttpclient "http://127.0.0.1/do/action"
fi
done

但是,我收到以下错误:

grep: engine: No such file or directory
grep: ready: No such file or directory

即使我看到记录器已经输出 ntp engine ready

改变行如下:

echo "$LINE" | grep -q "$string"

引号设置不正确。就像你执行它的时候:grep -q ntp engine ready; ntp 是要搜索的字符串,engineready 是文件。它必须看起来像:grep -q "ntp engine ready".

首先,您需要修改引号:

echo "$LINE" | grep -q "$string"

其次,你可以简单地做:

if echo "$LINE" | grep -q "$string"; then

而不是手动检查 return 代码 $?。请记住,[ 也是一个命令,if 只是检查它的 return 代码。

如果您确实需要使用 [,请记住 ] 是命令的参数,因此必须用空格将其括起来:

if [ $? = 0 ]

我还删除了第二个 =,因为它是支持它的 bash 扩展。实际上你正在做一个整数比较,所以实际上它应该是以下之一:

if [ $? -eq 0 ]  # POSIX compliant
if (( $? == 0 )) # bash arithmetic context