如何尽可能紧凑地确定最新的主要和完整内核版本字符串

时间:2013-01-14 13:42:58

标签: bash sed grep cut archlinux

所以我打算在这里做的就是尽可能紧凑地确定最新的主要版本和完整的内核版本字符串(没有很多管道来grep)。

我已经对结果非常满意了,但是如果有人有任何想法如何压扁第一行,即使是最轻微的,它也会非常棒(当no minor patches时它必须工作同样)。

kernel.org的索引仅为36kB,而http://www.kernel.org/pub/linux/kernel/v3.x/的索引为136kB,这就是我使用它的原因:

_major=$(curl -s http://www.kernel.org/ -o /tmp/kernel && cat /tmp/kernel | grep -A1 mainline | tail -1 | cut -d ">" -f3 | cut -d "<" -f1) 
pkgver=${_major}.$(cat /tmp/kernel | grep ${_major} | head -1 | cut -d "." -f6)

4 个答案:

答案 0 :(得分:3)

在这个阶段,这只是一个思考练习,因为真正的答案在上面的评论中,但这里有一些可能的改进。

原件:

_major=$(curl -s http://www.kernel.org/ -o /tmp/kernel && cat /tmp/kernel | grep -A1 mainline | tail -1 | cut -d ">" -f3 | cut -d "<" -f1)

使用tee而不是cat:

_major=$(curl -s http://www.kernel.org/ | tee /tmp/kernel | grep -A1 mainline | tail -1 | cut -d ">" -f3 | cut -d "<" -f1)

使用sed最小化管道数量,并使命令不可读

_major=$(curl -s http://www.kernel.org/ | tee /tmp/kernel | sed -n '/ainl/,/<\/s/ s|.*>\([0-9\.]*\)</st.*|\1|p')

廉价技巧:缩短网址

_major=$(curl -s kernel.org | tee /tmp/kernel | sed -n '/ainl/,/<\/s/ s|.*>\([0-9\.]*\)</st.*|\1|p')

答案 1 :(得分:3)

kernel.org在https://www.kernel.org/finger_banner

上提供了所有当前版本的纯文本列表。

对于主线:

curl -s https://www.kernel.org/finger_banner | grep mainline | awk '{print $NF}'

有关最新稳定版:

curl -s https://www.kernel.org/finger_banner | grep -m1 stable | awk '{print $NF}'

主线和最新的稳定版本永远不会停止运行,但其他版本通常不会停止运行,因此上述awk命令将不适用于所有版本。作为bash函数的一般解决方案:

latest_kernel() {
    curl -s https://www.kernel.org/finger_banner | grep -m1 $1 | sed -r 's/^.+: +([^ ]+)( .+)?$/\1/'
}

示例:

$ latest_kernel mainline
4.18-rc2
$ latest_kernel stable
4.17.3
$ latest_kernel 4.16
4.16.18

答案 2 :(得分:1)

你有一个useless use of cat。你可以替换:

cat /tmp/kernel | grep -A1 mainline

简单地说:

grep -A1 mainline /tmp/kernel

在您的情况下,您根本不需要该文件。默认情况下,Curl将发射到标准输出,因此您可以执行以下操作:

curl -s http://www.kernel.org/ | grep -A1 mainline

答案 3 :(得分:0)

通过扩展@Justin Brewer的答案,您可能想知道内核何时为EOL,因为这是有用的信息...以下单个awk命令将为您保留所有这些信息。

latest_kernel() {
    curl -s https://www.kernel.org/finger_banner |awk -F ':' -v search="$1" '{if ($1 ~ search) {gsub(/^[ ]+/, "", $2); print $2}}'
}
  • -F':'-字段分隔符,因为:之后的所有内容都是版本字符串。
  • -v search =“ $ 1”-将搜索字符串作为awk内部变量传递
  • if语句-检查字段$ 1是否与搜索字符串匹配
  • gsub-对字段$ 2进行就地修改以去除前导空格

然后仅在字段2中打印任何匹配的记录(我假设您的搜索字符串将仅匹配一行的左侧...如果在第一次匹配后退出很重要,请使用print $2; exit

搜索字符串可以包含空格等。使用awk变量并与~ variable进行匹配,而不是模式匹配'... /'“ $ 1”'/ ...',可以避免退出单引号-报价模式,并避免在搜索字符串包含“ /”的语法错误。