【问题标题】:tail -f | grep in if statement尾-f | if 语句中的 grep
【发布时间】:2021-10-08 18:55:37
【问题描述】:

我正在运行类似 bash 的脚本

$(command -options)&
export SC_PID=$!    
if tail -f <log_filename.txt> | grep --line-buffered -E "(some expression)"; then
        kill -STOP $SC_PID
fi

但它在命令行输出中写入"(some expression)" 而不是终止进程。请注意,log_filename.txt 是一个日志文件,从$(command -options) 实时写入输出。我做错了什么?

【问题讨论】:

  • 您可能需要-qgrep
  • 此代码有许多其他问题。命令替换没有意义。让进程处于停止状态几乎肯定是不对的。要么完全杀死它,要么不理它。 export 在这里是不必要的;它使变量可用于 subprocesses 但您这里没有要读取它的子进程。
  • 疑似与stackoverflow.com/questions/69491809/…相似——这是作业吗?
  • @tripleee 不,至少我的一个

标签: bash debian


【解决方案1】:

您的管道 (tail -f ... | grep ...) 永远不会结束。

-m 1 添加到您的GNU grep 以在第一次匹配后退出。

【讨论】:

  • -q 使用附加功能(在这种情况下)执行相同的操作,即在找到匹配项时不打印匹配项。
  • @tripleee 你是对的,但主要问题是没有杀死进程,所以'-m 1'是这个问题的解决方案
【解决方案2】:

您的带有“tail -f”的 if 语句在您中断它之前无法完成,因此它无法进入下一步。尝试按车道分割文本,如下所示:

$(command -options)&
export SC_PID=$!    
tail -f <log_filename.txt)|while read; do
  if (echo "$REPLY"|grep --line-buffered -E "(some expression)"); then
    kill -STOP $SC_PID
  fi
done

【讨论】:

  • 分析是正确的,但是OP的代码有很多问题。您添加的基本while read 只是(非常缓慢地)完成了grep 已经完成的操作。括号是不必要的;额外的括号之一是语法错误(我猜你放了更多,然后只删除了其中一个)。
  • 哦,--line-buffered 选项在这里没用;你似乎已经从我对几乎重复的答案中收集到了,你也非常相似地回答了。
  • --line-buffered 在原始脚本中,我只是在 topicstarter 代码周围添加了循环,它可以工作。
猜你喜欢
  • 1970-01-01
  • 2017-02-13
  • 2021-06-21
  • 1970-01-01
  • 2015-09-28
  • 2014-06-17
  • 1970-01-01
相关资源
最近更新 更多