Regex 侦听bash命令输出,当匹配字符串时,保存到文件并退出进程
我的实际用例是docker图像打印到标准输出,并且永远不会退出。我可以使用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
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问题