我的实际用例是使用 docker 图像将连续输出打印到 STDOUT 并且永不退出。我可以使用 ping
运行 ping google.com
当 icmp_seq=4
匹配时(例如)
然后将匹配的字符串保存到文件
以及pkill ping
我可以将我需要的字符串与:
ping google.com | grep -o "cmp_seq=4"
我还可以将所有输出写入文件:
ping google.com &>> .env
我期待这会起作用:
ping google.com | grep -o "cmp_seq=4" &>> .env
但是通过上面的内容我没有得到任何输出。所以我也尝试使用 until
until ping google.com | grep -o "cmp_seq=4"; do ; sleep 1; done;
它按预期输出字符串,但之后我无法终止该进程:
until ping google.com | grep -o "cmp_seq=4"; do ; sleep 1; done; pkill ping
我知道我可以设置 -c4
来停止输出,但在我的实际用例中,我没有使用 ping,并且无法以相同的方式停止请求。
最佳答案
grep
似乎是错误的工具。您可以直接在 bash
中使用正则表达式:
ping google.com | while IFS= read -r line; do
if [[ $line =~ cmp_seq=4 ]]; then
# Save the matched text and stop
printf "%s\n" "${BASH_REMATCH[0]}" >> outputfile
break
fi
done
这也会自动终止管道前面的源命令,而不必使用 pkill 等(假设它在写入标准输出时出现错误时退出)。
关于regex - 监听 bash 命令输出,当匹配字符串时,保存到文件并退出进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64380586/