我正在寻找一种以编程方式观察命令输出的方法,直到观察到特定字符串然后退出。这与this question非常相似,但我不想拖尾文件,而是要“拖尾”命令。
就像是:
看 -n1 my_cmd | grep -m 1 "我正在寻找的字符串"
(但这对我不起作用。)
更新:我需要澄清“my_cmd”不会连续输出文本,而是需要重复调用直到找到字符串(这就是我想到“watch”命令的原因)。在这方面,“my_cmd”就像许多其他 unix 命令,例如:ps、ls、lsof、last 等。
背景:
我正在为一个计算生物学软件编写一个测试脚本。我正在测试的软件可能需要数天甚至数周才能运行,因此它具有内置的恢复功能,以防系统崩溃或电源故障。
我想弄清楚如何测试恢复系统。具体来说,我想不出一种以受控方式“崩溃”程序的方法。我正在考虑以某种方式在一段时间后对 SIGKILL 指令进行计时。这可能并不理想,因为不能保证测试用例每次都以相同的速度运行(它在共享环境中运行),因此将日志与所需的输出进行比较会很困难。
该软件确实为它完成的每个分析部分打印一行。
题:
我想知道是否有一种好的/优雅的方式(在 shell 脚本中)来捕获程序的输出,然后在程序输出给定的行/行数时终止程序?
我用它来检查日志文件的日志行,直到发生特定事件(取自此答案“监视文件直到找到字符串”):
(tail -f -n 0 test.log &) | grep -q 'SPEFICIC LOG MESSAGE'
Run Code Online (Sandbox Code Playgroud)
这可行,但我还希望在等待事件时将日志行打印到标准输出。我正在寻找类似的东西tee,但我想同时打印和管道。
我尝试了这个答案来管道并观察管道输出?, 导致:
(tail -f -n 0 test.log &) | tee /dev/fd/2 | grep -q 'SPEFICIC LOG MESSAGE'
Run Code Online (Sandbox Code Playgroud)
但随后该命令永远不会退出,大概是因为在找到匹配项时grep无法中断,因此继续将数据传送到?tailtailtee