Bash 解析终端中命令的输出

Bash 解析终端中命令的输出,bash,shell,terminal,Bash,Shell,Terminal,我正在运行一个heroku命令heroku pg:backups:capture-appname来备份一个数据库,它在终端中返回如下输出: 随时使用Ctrl-C停止监控进度;备份将继续运行。 使用heroku pg:backups:info检查进度。 使用heroku pg:backups:cancel停止正在运行的备份。 正在启动postgresql-XXXXXXXXX的备份。。。完成 正在将数据库备份到b007。。。完成 如何将备份名称b007自动存储到变量 您可以通过管道将命令传输到sed

我正在运行一个heroku命令heroku pg:backups:capture-appname来备份一个数据库,它在终端中返回如下输出:

随时使用Ctrl-C停止监控进度;备份将继续运行。 使用heroku pg:backups:info检查进度。 使用heroku pg:backups:cancel停止正在运行的备份。 正在启动postgresql-XXXXXXXXX的备份。。。完成 正在将数据库备份到b007。。。完成
如何将备份名称b007自动存储到变量

您可以通过管道将命令传输到sed以提取所需字符串:

 dbname=$(heroku pg:backups:capture --app appname | sed -n 's/.*DATABASE to \([^\.]*\)\.\.\..*/\1/p')

您可以通过管道将命令传输到sed以提取所需字符串:

 dbname=$(heroku pg:backups:capture --app appname | sed -n 's/.*DATABASE to \([^\.]*\)\.\.\..*/\1/p')

您可以通过管道将程序的输出重定向到

grep将数据库备份到| awk'{print substr$5,0,5}'

它将是:


var=$heroku pg:backups:capture-app appname | grep将数据库备份到| awk'{print substr$5,0,5}'

您可以通过管道将程序的输出重定向到

grep将数据库备份到| awk'{print substr$5,0,5}'

它将是:


var=$heroku pg:backups:capture-app-appname | grep将数据库备份到| awk'{print substr$5,0,5}'

简单化的可能性:

while read -r line
do echo "$line"
   case "$line" in
   Backing\ up\ DATABASE\ to\ *done)
       backup="${line%%... done}"
       backup="${backup##* }"
   esac
done < <( heroku pg:backups:capture --app appname )
echo "Backup: [$backup]"

过于简单的可能性:

while read -r line
do echo "$line"
   case "$line" in
   Backing\ up\ DATABASE\ to\ *done)
       backup="${line%%... done}"
       backup="${backup##* }"
   esac
done < <( heroku pg:backups:capture --app appname )
echo "Backup: [$backup]"

实际上这不起作用。运行heroku命令后,终端界面显示进度,类似于下图,备份完成后,显示为“完成”。也许这就是你建议的命令不起作用的原因?@vikiboy尝试在管道前添加2>&1。可能是heroku使用了stderr而不是stdout。实际上这不起作用。运行heroku命令后,终端界面显示进度,类似于下图,备份完成后,显示为“完成”。也许这就是你建议的命令不起作用的原因?@vikiboy尝试在管道前添加2>&1。可能是heroku使用了stderr而不是stdout。我编辑了问题中的输出行。这会更新你的答案吗?抱歉给你添麻烦了。我看到了时间,并根据您的建议检查输出。根据输出,您只需更改您给grep和awk的参数。grep将过滤所有不包含您提供的字符串的行,awk将从行中取出您想要的部分。我编辑了问题中的输出行。这会更新你的答案吗?抱歉给你添麻烦了。我看到了时间,并根据您的建议检查输出。根据输出,您只需更改您给grep和awk的参数。grep将筛选所有不包含您提供的字符串的行,awk将从该行中取出您需要的部分。备份:[]已尝试。我明白了。确保匹配字符串准确无误。这适用于我从您的OP复制/粘贴的内容,但如果输出不同,则必须进行调整。备份:[]尝试过。我明白了。确保匹配字符串准确无误。这适用于我从您的OP复制/粘贴的内容,但如果输出不同,您必须进行调整。