如何比较 unix 命令的 shell 脚本输出的任何字符串

如何比较 unix 命令的 shell 脚本输出的任何字符串

我运行一个命令后立即获得一个日志文件(进程仍在后台运行)。现在我想从该日志文件中获取状态(干净或不干净)。如果状态是干净的,那么我将保持进程原样;否则,如果它不干净,那么我必须终止由我的第一个命令启动的进程,然后再次重新运行相同的命令。

我已经尝试过了cat logfilename | grep "un-clean"。但我不知道如何在 shell 脚本中验证这个输出。

我想要的是(大致)var= clean then the output of above command == var if yes then echo "ok" else re-run command

我尝试了一些命令,但对我来说不起作用。

答案1

基本上,你想要这个结构

if grep -q "un-clean"  /path/to/log_file.log ;
then
    # put some command in case we find result is unclean
else 
    # if the output is ok, do something else
fi

它所做的只是默默地(不打印到屏幕上)检查文件中是否有字符串“unclean”匹配。如果有,我们执行 if 部分,否则 - 我们执行 else 部分。

以下是一个例子:

$> if grep -q 'root' /etc/passwd ; then  echo "This user exists" ; else echo "This user doesn't exist"; fi    
This user exists
$> if grep -q 'NOEXIST' /etc/passwd ; then  echo "This user exists" ; else echo "This user doesn't exist"; fi 
This user doesn't exist

您还可以做的是从脚本启动您想要的命令,但在后台。这样我们就可以得到它的 PID。这就是我的意思

$> echo "HelloWorld"   &                                                                                      
[1] 6876

添加&导致echo "HelloWorld"在后台运行,并且我们将其 PID 存储在$!变量中。因此,我们可以执行以下操作:

some-command  &
CMD_PID=$!
if grep -q "un-clean"  /path/to/log_file.log ;
then
         kill -TERM $CMD_PID
else 
        # if the output is ok, do something else
fi

答案2

您是否尝试过这样的事情:

some-command  &
PID=$!
wait $PID
while grep -q un-clean filename.log ; do
  kill -TERM $PID
  some-command  &
  PID=$!
  wait $PID
done

当文件包含字符串时,该进程将被终止(参见killall:)man killall并且命令将运行。re-runfilename.logun-clean

这有帮助吗?

编辑:使用好的@Serg 解决方案更新帖子,并添加了wait在检查日志文件之前等待命令结束的命令。

相关内容