使用 shell 脚本从 postgresql artifacoty 获取最新版本的 postgresql 版本(centos 环境)
Fetch latest version of postgresql version from the postgresql artifacoty using shell script (centos environment)
我想获取上传到 PostgreSQL artifactory 的最新 tar 文件的名称,并希望自动执行相同的过程。
我指的是:https://ftp.postgresql.org/pub/odbc/versions/src/
我正在提取一个 XML 从上面解析 URL
XML 文件看起来像这样:
<html>
<head><title>Index of /pub/odbc/versions/src/</title></head>
<body bgcolor="white">
<h1>Index of /pub/odbc/versions/src/</h1><hr><pre><a href="../">../</a>
<a href="psqlodbc-11.00.0000.tar.gz">psqlodbc-11.00.0000.tar.gz</a> 17-Nov-2018 13:50 918461
<a href="psqlodbc-11.01.0000.tar.gz">psqlodbc-11.01.0000.tar.gz</a> 24-May-2019 14:28 919372
<a href="psqlodbc-12.00.0000.tar.gz">psqlodbc-12.00.0000.tar.gz</a> 11-Oct-2019 14:14 920713
<a href="psqlodbc-12.01.0000.tar.gz">psqlodbc-12.01.0000.tar.gz</a> 07-Jan-2020 13:53 932672
<a href="psqlodbc-12.02.0000.tar.gz">psqlodbc-12.02.0000.tar.gz</a> 26-May-2020 13:01 937847
<a href="psqlodbc-13.00.0000.tar.gz">psqlodbc-13.00.0000.tar.gz</a> 19-Nov-2020 09:53 940031
<a href="psqlodbc-13.01.0000.tar.gz">psqlodbc-13.01.0000.tar.gz</a> 02-May-2021 12:27 941064
<a href="psqlodbc-7.2.3.tar.gz">psqlodbc-7.2.3.tar.gz</a> 16-Oct-2002 09:09 367168
<a href="psqlodbc-7.2.4.tar.gz">psqlodbc-7.2.4.tar.gz</a> 12-Nov-2002 08:41 406385
<a href="psqlodbc-7.2.5.tar.gz">psqlodbc-7.2.5.tar.gz</a> 29-Nov-2002 16:10 415885
</pre></hr></body>
</html>
我想根据修改日期获取上传到 XML 的最新版本。
我试过了
xmllint --xpath "string(//a[last()]/text())" myfile.xml
但它给出输出:psqlodbc-7.2.5.tar.gz(这不是我想要的)
我希望输出为:psqlodbc-13.01。0000.tar.gz(因为它最近于 2021 年 5 月 2 日修改过 12:27)
找到解决方法:
artifactCount=$(xmllint --xpath "count(//a)" psql.xml)
latestModified="20010101"
for (( i=2; i<=${artifactCount}; i++ ))
do
dateModified=$(xmllint --xpath "string(//pre/text()[$i])" psql.xml)
dateModified=$(echo ${dateModified} | awk '{$NF="";sub(/[ \t]+$/,"")}1')
dateModified=$(echo ${dateModified} | awk '{$NF="";sub(/[ \t]+$/,"")}1')
dateModified=$(date -d "$dateModified" +%Y%m%d)
if [ ${dateModified} -gt ${latestModified} ]
then
latestModified=${dateModified}
j=${i}
fi
done
psqlfile=$(xmllint --xpath "string(//a[${j}]/text())" psql.xml)
echo "Latest file found : ${psqlfile} modified on ${latestModified} "
psqlversion=${psqlfile#"psqlodbc-"}
psqlversion=${psqlversion%".tar.gz"}
试试这个:
sed 's/\([0-9]\{2\}\)-\([a-zA-Z]\{3\}\)-\([0-9]\{4\}\)/ /' myfile.xml | sort -k5,5 -k4,4M -k3,3 -k6,6 | grep -oP '(?<=">).*(?=<)' | tail -1
首先,使用 sed
格式化文件的日期,如 17-Nov-2018 将 -
替换为空白,然后按 sort -k
排序.
然后使用sort -k
by the order: year, month, day, time.
Last 使用grep
和tail
来抓取最后一个文件名。
另一种方式,我发现最后一列像 941064,也是按顺序排序的,所以它只能使用这个命令:
sort -k5,5 myfile.xml | grep -oP '(?<=">).*(?=<)' | tail -1
xmllint
无法打开 url,仅支持 XPath 1.0,上次我检查过。我建议你 xidel 试试看。
$ xidel -s https://ftp.postgresql.org/pub/odbc/versions/src/ -e 'x:lines(//pre)'
../
psqlodbc-07.03.0100.tar.gz 15-May-2003 15:56 446075
psqlodbc-07.03.0200.tar.gz 22-Oct-2003 13:46 451263
[...]
psqlodbc-7.2.5.tar.gz 29-Nov-2002 16:10 415885
$ xidel -s https://ftp.postgresql.org/pub/odbc/versions/src/ -e '
x:lines(//pre)[position() gt 1]
'
psqlodbc-07.03.0100.tar.gz 15-May-2003 15:56 446075
psqlodbc-07.03.0200.tar.gz 22-Oct-2003 13:46 451263
psqlodbc-08.00.0100.tar.gz 02-Mar-2005 14:35 586241
[...]
psqlodbc-7.2.5.tar.gz 29-Nov-2002 16:10 415885
(x:lines()
是 tokenize(...,'\r\n?|\n')
的 shorthand 并将输入转换为一个序列,其中每个新行都是另一个项目)
$ xidel -s https://ftp.postgresql.org/pub/odbc/versions/src/ -e '
x:lines(//pre)[last()] ! tokenize(.,"\s{2,}")
'
psqlodbc-7.2.5.tar.gz
29-Nov-2002 16:10
415885
$ xidel -s https://ftp.postgresql.org/pub/odbc/versions/src/ -e '
x:lines(//pre)[last()] ! parse-ietf-date(tokenize(.,"\s{2,}")[2])
'
2002-11-29T16:10:00Z
$ xidel -s https://ftp.postgresql.org/pub/odbc/versions/src/ -e '
for $release in x:lines(//pre)[position() gt 1]
order by parse-ietf-date(tokenize($release,"\s{2,}")[2])
return $release
'
psqlodbc-7.2.3.tar.gz 16-Oct-2002 09:09 367168
psqlodbc-7.2.4.tar.gz 12-Nov-2002 08:41 406385
psqlodbc-7.2.5.tar.gz 29-Nov-2002 16:10 415885
[...]
psqlodbc-13.01.0000.tar.gz 02-May-2021 12:27 941064
$ xidel -s https://ftp.postgresql.org/pub/odbc/versions/src/ -e '
(
for $release in x:lines(//pre)[position() gt 1]
order by parse-ietf-date(tokenize($release,"\s{2,}")[2])
return $release
)[last()]
'
psqlodbc-13.01.0000.tar.gz 02-May-2021 12:27 941064
$ xidel -s https://ftp.postgresql.org/pub/odbc/versions/src/ -e '
resolve-uri(
(
for $release in x:lines(//pre)[position() gt 1]
let $item:=tokenize($release,"\s{2,}")
order by parse-ietf-date($item[2])
return $item[1]
)[last()]
)
'
https://ftp.postgresql.org/pub/odbc/versions/src/psqlodbc-13.01.0000.tar.gz
我想获取上传到 PostgreSQL artifactory 的最新 tar 文件的名称,并希望自动执行相同的过程。
我指的是:https://ftp.postgresql.org/pub/odbc/versions/src/
我正在提取一个 XML 从上面解析 URL
XML 文件看起来像这样:
<html>
<head><title>Index of /pub/odbc/versions/src/</title></head>
<body bgcolor="white">
<h1>Index of /pub/odbc/versions/src/</h1><hr><pre><a href="../">../</a>
<a href="psqlodbc-11.00.0000.tar.gz">psqlodbc-11.00.0000.tar.gz</a> 17-Nov-2018 13:50 918461
<a href="psqlodbc-11.01.0000.tar.gz">psqlodbc-11.01.0000.tar.gz</a> 24-May-2019 14:28 919372
<a href="psqlodbc-12.00.0000.tar.gz">psqlodbc-12.00.0000.tar.gz</a> 11-Oct-2019 14:14 920713
<a href="psqlodbc-12.01.0000.tar.gz">psqlodbc-12.01.0000.tar.gz</a> 07-Jan-2020 13:53 932672
<a href="psqlodbc-12.02.0000.tar.gz">psqlodbc-12.02.0000.tar.gz</a> 26-May-2020 13:01 937847
<a href="psqlodbc-13.00.0000.tar.gz">psqlodbc-13.00.0000.tar.gz</a> 19-Nov-2020 09:53 940031
<a href="psqlodbc-13.01.0000.tar.gz">psqlodbc-13.01.0000.tar.gz</a> 02-May-2021 12:27 941064
<a href="psqlodbc-7.2.3.tar.gz">psqlodbc-7.2.3.tar.gz</a> 16-Oct-2002 09:09 367168
<a href="psqlodbc-7.2.4.tar.gz">psqlodbc-7.2.4.tar.gz</a> 12-Nov-2002 08:41 406385
<a href="psqlodbc-7.2.5.tar.gz">psqlodbc-7.2.5.tar.gz</a> 29-Nov-2002 16:10 415885
</pre></hr></body>
</html>
我想根据修改日期获取上传到 XML 的最新版本。
我试过了
xmllint --xpath "string(//a[last()]/text())" myfile.xml
但它给出输出:psqlodbc-7.2.5.tar.gz(这不是我想要的)
我希望输出为:psqlodbc-13.01。0000.tar.gz(因为它最近于 2021 年 5 月 2 日修改过 12:27)
找到解决方法:
artifactCount=$(xmllint --xpath "count(//a)" psql.xml)
latestModified="20010101"
for (( i=2; i<=${artifactCount}; i++ ))
do
dateModified=$(xmllint --xpath "string(//pre/text()[$i])" psql.xml)
dateModified=$(echo ${dateModified} | awk '{$NF="";sub(/[ \t]+$/,"")}1')
dateModified=$(echo ${dateModified} | awk '{$NF="";sub(/[ \t]+$/,"")}1')
dateModified=$(date -d "$dateModified" +%Y%m%d)
if [ ${dateModified} -gt ${latestModified} ]
then
latestModified=${dateModified}
j=${i}
fi
done
psqlfile=$(xmllint --xpath "string(//a[${j}]/text())" psql.xml)
echo "Latest file found : ${psqlfile} modified on ${latestModified} "
psqlversion=${psqlfile#"psqlodbc-"}
psqlversion=${psqlversion%".tar.gz"}
试试这个:
sed 's/\([0-9]\{2\}\)-\([a-zA-Z]\{3\}\)-\([0-9]\{4\}\)/ /' myfile.xml | sort -k5,5 -k4,4M -k3,3 -k6,6 | grep -oP '(?<=">).*(?=<)' | tail -1
首先,使用 sed
格式化文件的日期,如 17-Nov-2018 将 -
替换为空白,然后按 sort -k
排序.
然后使用sort -k
by the order: year, month, day, time.
Last 使用grep
和tail
来抓取最后一个文件名。
另一种方式,我发现最后一列像 941064,也是按顺序排序的,所以它只能使用这个命令:
sort -k5,5 myfile.xml | grep -oP '(?<=">).*(?=<)' | tail -1
xmllint
无法打开 url,仅支持 XPath 1.0,上次我检查过。我建议你 xidel 试试看。
$ xidel -s https://ftp.postgresql.org/pub/odbc/versions/src/ -e 'x:lines(//pre)'
../
psqlodbc-07.03.0100.tar.gz 15-May-2003 15:56 446075
psqlodbc-07.03.0200.tar.gz 22-Oct-2003 13:46 451263
[...]
psqlodbc-7.2.5.tar.gz 29-Nov-2002 16:10 415885
$ xidel -s https://ftp.postgresql.org/pub/odbc/versions/src/ -e '
x:lines(//pre)[position() gt 1]
'
psqlodbc-07.03.0100.tar.gz 15-May-2003 15:56 446075
psqlodbc-07.03.0200.tar.gz 22-Oct-2003 13:46 451263
psqlodbc-08.00.0100.tar.gz 02-Mar-2005 14:35 586241
[...]
psqlodbc-7.2.5.tar.gz 29-Nov-2002 16:10 415885
(x:lines()
是 tokenize(...,'\r\n?|\n')
的 shorthand 并将输入转换为一个序列,其中每个新行都是另一个项目)
$ xidel -s https://ftp.postgresql.org/pub/odbc/versions/src/ -e '
x:lines(//pre)[last()] ! tokenize(.,"\s{2,}")
'
psqlodbc-7.2.5.tar.gz
29-Nov-2002 16:10
415885
$ xidel -s https://ftp.postgresql.org/pub/odbc/versions/src/ -e '
x:lines(//pre)[last()] ! parse-ietf-date(tokenize(.,"\s{2,}")[2])
'
2002-11-29T16:10:00Z
$ xidel -s https://ftp.postgresql.org/pub/odbc/versions/src/ -e '
for $release in x:lines(//pre)[position() gt 1]
order by parse-ietf-date(tokenize($release,"\s{2,}")[2])
return $release
'
psqlodbc-7.2.3.tar.gz 16-Oct-2002 09:09 367168
psqlodbc-7.2.4.tar.gz 12-Nov-2002 08:41 406385
psqlodbc-7.2.5.tar.gz 29-Nov-2002 16:10 415885
[...]
psqlodbc-13.01.0000.tar.gz 02-May-2021 12:27 941064
$ xidel -s https://ftp.postgresql.org/pub/odbc/versions/src/ -e '
(
for $release in x:lines(//pre)[position() gt 1]
order by parse-ietf-date(tokenize($release,"\s{2,}")[2])
return $release
)[last()]
'
psqlodbc-13.01.0000.tar.gz 02-May-2021 12:27 941064
$ xidel -s https://ftp.postgresql.org/pub/odbc/versions/src/ -e '
resolve-uri(
(
for $release in x:lines(//pre)[position() gt 1]
let $item:=tokenize($release,"\s{2,}")
order by parse-ietf-date($item[2])
return $item[1]
)[last()]
)
'
https://ftp.postgresql.org/pub/odbc/versions/src/psqlodbc-13.01.0000.tar.gz