【问题标题】:How to determine the latest major and full kernel version string as compactly as possible如何尽可能紧凑地确定最新的主要和完整内核版本字符串
【发布时间】:2012-12-28 11:28:58
【问题描述】:

所以我打算在这里做的是尽可能紧凑地确定最新的主要版本和完整的内核版本字符串(没有无数管道到 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)

【问题讨论】:

  • 主线还是稳定版?您的代码似乎有问题,所以我无法判断您的意图。
  • 呃,解析首页会很痛苦。你能假设你的机器上有git吗?如果这样做,最好处理git ls-remote -t git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git的输出
  • +1 用于 git;主页可能在说谎。
  • @John Zwinck,好吧,不,这不是马车:D。我正在从第一行说“主线”之后的 _major 字符串中删除,因为这是它在kernel.org 中的标题(只需单击并查看)。在pkgver 中的major 变量之后还有点(.),所以这可能是某种线索。 @Josh Coartwright,哈哈,是的,我注意到了。那太棒了。坦率地说,我什至没有想到,但由于我只是在寻找稳定版本,我假设它必须是:git ls-remote -t git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git?
  • @Det,是的,应该可以。

标签: bash sed grep cut archlinux


【解决方案1】:

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

原文:

_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')

【讨论】:

  • 太棒了。我只是希望我能这样评价你的答案。
  • curl -s kernel.org | sed -n '/ainl/,/&lt;\/s/ s|.*&gt;\([0-9\.]*\)&lt;/st.*|\1|p' 单独执行相同的操作,除非您需要保存该文件 /tmp/kernel
  • @Martin Canaval,是的,我愿意,正如已经说过几次 =)。
【解决方案2】:

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}'

主线和最新的稳定版本永远不会 EOL,但其他版本经常是,因此上述 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

【讨论】:

  • 非常好,添加了一些替代品。
【解决方案3】:

你有一个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

【讨论】:

  • 嗯,是的,谢谢,但 dwurf 的回答更好:D。我将它保存到一个文件中,因为我需要在两个变量中使用它并且我只想获取它一次(这也是我使用 kernel.org (36k) 而不是 kernel.org/pub/linux/kernel/v3.x (136k) 的原因)
  • 对不起,我错过了该文件再次被使用。
  • @Det 我看到你只是在推卸责任,哈哈!
  • @Det 如果你推卸责任,你应该把反冲还给你;p
  • @randomstring 很好。我以前曾获得过那个“奖”,但后来忘记了整件事。只是让我想到整件事就笑了,所以我决定“继续”。
【解决方案4】:

扩展 @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"'/...' 避免了退出单引号模式的需要并避免搜索字符串包含“/”的语法错误。

【讨论】:

    猜你喜欢
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 2015-12-23
    • 1970-01-01
    • 2012-10-06
    • 2010-10-02
    相关资源
    最近更新 更多