【问题标题】:Listen for bash command output and when matching a string, save to file and exit process监听 bash 命令输出,匹配字符串时,保存到文件并退出进程
【发布时间】:2020-10-15 22:39:30
【问题描述】:

我的实际用例是使用 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 并且无法以相同的方式停止请求。

【问题讨论】:

    标签: regex bash shell


    【解决方案1】:

    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 或类似的东西(假设它在写入标准输出时出错时退出)。

    【讨论】:

      【解决方案2】:

      选择的答案,回答原始问题。我的实际用例是运行一个 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 问题here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-22
        • 1970-01-01
        相关资源
        最近更新 更多