我必须使用 tail 将日志文件的输出写入另一个文件,直到找到 string 。
日志文件包含-
I am Rahul.
I have 5 oranges.
The end.
Something something.
直到“最后”,我希望将所有内容写入另一个文件。
tail -f var/log/output.log
| grep -m 1 "The end" | tee
Abc.txt
但 abc.txt 文件中只写了“结束”。
答案1
答案2
grep
此处无法使用,因为grep
用于从流或文件中提取与某些模式匹配的行,在这种情况下您想要停止当找到特定字符串时输出。本质上,您必须提供grep
一些与该行之前的所有行相匹配的模式The end.
,并且该行之后不匹配任何行。
sed '/The end\./q'
The end.
此命令将从其标准输入流输出每一行,直到看到包含该字符串的行。此时,将输出最后一行,并且该sed
命令将由于执行脚本q
中的命令而终止sed
。
作为管道的一部分:
tail -f var/log/output.log |
sed '/The end\./q' |
tee Abc.txt
根据命令的实现tail
,一旦The end.
遇到该行,或者一旦tail -f
尝试写入不存在的sed
进程,即一旦该The end.
行被看到sed
并且该Something something.
行被输出,该管道就会终止tail -f
。
tail
在 OpenBSD(其行为不像 POSIX tail
)上表现出最后描述的行为,而 GNUtail
会给出第一个行为(一旦The end.
遇到该行立即终止)。