regex - 监听 bash 命令输出,当匹配字符串时,保存到文件并退出进程

标签 regex bash shell

我的实际用例是使用 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/

相关文章:

shell - 将 grep 的输出存储到带有分隔符的变量

java - 正则表达式中的 (DEFINE) 功能在 Java 中不起作用

regex - 如何替换文件中的版本号?

linux - CSV 文件不输出数据对齐不起作用

bash - 在 Makefile 中测试软件版本

linux - 将查找结果复制到另一个目录时出现问题

c++ - 将 clangd stderr 重定向到文件而不是控制台

C#如何Regex.Replace "\r\n"(实际字符,不是换行符)

Syslog 消息的 Java 正则表达式不起作用

python - 确定进程是否已成功终止