使用 shell 脚本(centos 环境)从 postgresql artifacoty 获取最新版本的 postgresql 版本

Posted

技术标签:

【中文标题】使用 shell 脚本(centos 环境)从 postgresql artifacoty 获取最新版本的 postgresql 版本【英文标题】:Fetch latest version of postgresql version from the postgresql artifacoty using shell script (centos environment) 【发布时间】:2021-10-01 01:31:43 【问题描述】:

我想获取上传到 PostgreSQL 工件的最新 tar 文件的名称,并希望自动化相同的过程。

我指的是:https://ftp.postgresql.org/pub/odbc/versions/src/

我正在从上面的 URL 中提取要解析的 XML

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"

【问题讨论】:

【参考方案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') 的简写,并将输入转换为一个序列,其中每个新行都是另一个项目)

$ xidel -s https://ftp.postgresql.org/pub/odbc/versions/src/ -e '
  x:lines(//pre)[last()] ! tokenize(.,"\s2,")
'
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(.,"\s2,")[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,"\s2,")[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,"\s2,")[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,"\s2,")
      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

【讨论】:

【参考方案2】:

试试这个:

sed 's/\([0-9]\2\\)-\([a-zA-Z]\3\\)-\([0-9]\4\\)/\1 \2 \3/' myfile.xml | sort -k5,5 -k4,4M -k3,3 -k6,6 | grep -oP '(?<=">).*(?=<)' | tail -1

首先,使用sed 格式化文件的日期,如2018 年11 月17 日- 替换为空白,然后按sort -k 排序。

然后按顺序使用sort -kyear, month, day, time

Last 使用 greptail 擦除最后一个文件名。

另外,我发现最后一列像941064,也是按顺序排序的,所以只能使用这个命令:

sort -k5,5 myfile.xml | grep -oP '(?<=">).*(?=<)' | tail -1

【讨论】:

以上是关于使用 shell 脚本(centos 环境)从 postgresql artifacoty 获取最新版本的 postgresql 版本的主要内容,如果未能解决你的问题,请参考以下文章

简单shell脚本之检测centos7基本环境

shell脚本之安装ansible(centos7环境)

Linux下使用shell脚本远程登录主机(Ubuntu & CentOS)

CentOS 7 MySQL5.6分库分表-全备-shell脚本

CentOS7linux通过http配置共享自动创建yum源的shell脚本

shell脚本之centos批量创建用户