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

Regex 侦听bash命令输出,当匹配字符串时,保存到文件并退出进程,regex,bash,shell,Regex,Bash,Shell,我的实际用例是docker图像打印到标准输出,并且永远不会退出。我可以使用ping 运行ping google.com 当icmp_seq=4匹配时(例如) 然后将匹配的字符串保存到文件中 和pkill ping 我可以将我需要的字符串与以下字符串匹配: ping google.com | grep -o "cmp_seq=4" 我还可以将所有输出写入文件: ping google.com &>> .env 我原以为这会奏效: ping google

我的实际用例是docker图像打印到标准输出,并且永远不会退出。我可以使用
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 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 |而IFS=read-r行;做
如果[$line=~cmp_seq=4]];然后
#保存匹配的文本并停止
printf“%s\n”“${BASH\u重新匹配[0]}”>>输出文件
打破
fi
完成

这也将自动终止管道前端的源命令,而无需使用
pkill
或类似工具(假设在写入标准输出时出错时退出)。

所选答案回答了原始问题。我的实际用例是运行docker容器,因此仅供参考,以防其他人对docker也这么做,以下是我的结论:

echo -n 'ENV_VAR_NAME=' >> .env
docker run --name="docker-instance-name" --network="host" --rm -it some/docker-image long-running-command | while read -r line
  do
    if [[ $line =~ keyprefix ]]; then
      docker stop docker-instance-name
      echo $line | grep -o 'keyprefix_[A-Za-z0-9]*' >> .env
    fi
  done
注意,我不能使用
break
,而是需要在尝试将行输出到文件之前运行
docker-stop

.env
导致:

ENV_VAR_NAME=keyprefix_abc123
假设此命令的输出:

docker run --name="docker-instance-name" --network="host" --rm -it some/docker-image long-running-command

Some log
Some log
Here is your key: keyprefix_abc123 (Press ctrl+c to quit)
更具体地说,这是我在使用Stripe CLI时遇到的一个问题。我想从命令输出中获取签名密钥,请参阅此GitHub问题