如何在Bash脚本中提取各子版本的最高次版本号?
解决方法:提取每个子版本的最高次版本号
嘿,你已经完成了最关键的一步——筛选出符合要求的版本号!现在要实现每个子版本(比如1.10、1.11)只保留最高的次版本号,用awk就能轻松搞定,给你两种实用的方案:
方案一:用awk分组记录最大值
先把你现有的命令输出(空格分隔的版本号)拆成每行一个,再用awk按「主版本.子版本」分组,记录每个组里最大的次版本号:
curl -v --silent https://website.com.rss 2>&1 | awk -F '<title>|</title>' '{print $2}' | grep "^1\.[0-9][0-9]\." | tr ' ' '\n' | awk -F. ' { # 生成分组键:主版本.子版本(比如1.10、1.11) key = $1 "." $2 # 如果当前次版本号比该组已记录的最大值大,就更新最大值 if ($3 > max[key]) { max[key] = $3 } } END { # 遍历所有分组,输出完整的最高版本号 for (k in max) { print k "." max[k] } }'
原理说明:
tr ' ' '\n':把空格分隔的版本号转换成每行一个,方便awk逐行处理-F.:把版本号按小数点拆分成3部分($1=主版本,$2=子版本,$3=次版本)- 用
key作为分组标识,max[key]存储该组的最大次版本号 - END块遍历所有分组,拼接成完整的最高版本号输出
方案二:用版本排序+去重
如果你的系统支持sort -V(版本号排序,大部分Linux发行版都支持),可以用排序+去重的思路:
curl -v --silent https://website.com.rss 2>&1 | awk -F '<title>|</title>' '{print $2}' | grep "^1\.[0-9][0-9]\." | tr ' ' '\n' | sort -Vr | awk -F. ' { key = $1 "." $2 # 如果该分组还没输出过,就打印当前行并标记为已输出 if (!seen[key]++) { print } }'
原理说明:
sort -Vr:按版本号降序排列,这样每个子版本的最高次版本会排在最前面seen[key]++:用数组记录每个分组是否已经输出过,第一次遇到的就是该组的最高版本,直接打印即可
这两种方法都能得到你想要的结果:1.10.3 1.11.4(顺序可能略有不同,但都是正确的最高版本)。如果需要按版本号升序输出,方案一可以在END块里加个排序,方案二把sort -Vr改成sort -V再反向处理就行~
内容的提问来源于stack exchange,提问作者DanTdd
相关产品推荐
相关产品推荐

