从shell命令的响应中获取文本

时间:2013-09-04 11:17:58

标签: bash shell zsh

我想写一个脚本来自动完成我做的重复性任务。

我发出这个命令:

heroku pgbackups:capture --expire

我得到了这个回复

  

MY_DB_URL(DATABASE_URL)----备份---> b677

然后我用捕获号码(上面的b677)发出此命令

curl -o latest.dump `heroku pgbackups:url b677`

如何解析文本并将值放入下一个命令?

4 个答案:

答案 0 :(得分:1)

只需要解析第一个命令的输出并将其保存到变量中:

capnum=$(heroku pgbackups:capture --expire | grep -- "--->" | awk '{print $NF}')

然后执行,

curl -o latest.dump $(heroku pgbackups:url ${capnum})

或者,您可以说:

curl -o latest.dump $(heroku pgbackups:url $(heroku pgbackups:capture --expire | grep -- "--->" | awk '{print $NF}'))

答案 1 :(得分:1)

更多方式:

read __ __ __ URL < <(exec heroku pgbackups:capture --expire)
curl -o latest.dump "$URL"

curl -o latest.dump $(exec heroku pgbackups:capture --expire | cut -f 4 -d ' ')

curl -o latest.dump $(exec heroku pgbackups:capture --expire | sed 's|.* ||')

答案 2 :(得分:0)

好吧,如果捕获号码的格式总是相同,你可以使用

captureNumber=`heroku pgbackups:capture --expire | grep -o [a-Z][0-9]*$`

curl -o latest.dump `heroku pgbackups:url ${captureNumber}`

或者,或许更一般地,检测最后一个空格并使用该行的其余部分:

captureNumber=`heroku pgbackups:capture --expire | grep -o \s.*$`

如果我不知道有不同的格式,请调整正则表达式,如果正则表达式没有很好地捕获格式,请使用devnull的答案。

答案 3 :(得分:0)

使用sed和shell脚本可行。

#!/bin/sh
s=`heroku pgbackups:capture --expire`
id=`echo ${s} | sed -e "s/^.*> \(b[0-9]*\)$/\1/"`
url=`echo heroku pgbackups:url ${id}`
curl -o last.dump "${url}"

这不是最漂亮的shell脚本,但它可以作为概念的证明。