我有一个当前安装的内核的列表,我正在尝试 grep 出当前安装的内核和以前安装的内核。对于此示例,linux-image-3.2.0-60-generic 是当前运行的内核,这些是已安装的内核:
linux-image-3.2.0-49-generic
linux-image-3.2.0-51-generic
linux-image-3.2.0-52-generic
linux-image-3.2.0-53-generic
linux-image-3.2.0-54-generic
linux-image-3.2.0-55-generic
linux-image-3.2.0-56-generic
linux-image-3.2.0-57-generic
linux-image-3.2.0-58-generic
linux-image-3.2.0-59-generic
linux-image-3.2.0-60-generic
linux-image-3.2.0-61-generic
linux-image-3.2.0-63-generic
linux-image-3.2.0-64-generic
我可以用来grep -v $(uname -r)
从此列表中删除当前正在运行的内核。但是,我似乎无法grep -v -B 1 $(uname -r)
从列表中删除当前和以前的内核。有没有办法将-B
和结合起来-v
?或者我完全是从错误的方向来处理这个问题的?
答案1
你可以使用 2 个 grep 来得到你想要的。内部将生成当前内核及其先前版本的grep
匹配“列表” 。uname -r
外部grep
将为您提供不包括这 2 个内核的列表。
$ grep -v "$(grep -B 1 "$(uname -r)" list.txt)" list.txt
例子
为了模拟您所拥有的内容,我已将这些内容添加到文件中list.txt
。
$ cat list.txt
linux-image-3.2.0-49-generic
linux-image-3.2.0-51-generic
linux-image-3.2.0-52-generic
linux-image-3.2.0-53-generic
linux-image-3.2.0-54-generic
linux-image-3.2.0-55-generic
linux-image-3.2.0-56-generic
linux-image-3.2.0-57-generic
linux-image-3.2.0-58-generic
linux-image-3.2.0-59-generic
linux-image-3.2.0-60-generic
linux-image-3.2.0-61-generic
linux-image-3.2.0-63-generic
linux-image-3.2.0-64-generic
现在让我们假设该命令uname -r
返回此字符串:
$ uname -r
3.2.0-60-generic
因此,当我运行此命令时,我会得到一个内核列表,减去uname -r
它之前的版本。
$ grep -v "$(grep -B 1 "3.2.0-60-generic" list.txt)" list.txt
linux-image-3.2.0-49-generic
linux-image-3.2.0-51-generic
linux-image-3.2.0-52-generic
linux-image-3.2.0-53-generic
linux-image-3.2.0-54-generic
linux-image-3.2.0-55-generic
linux-image-3.2.0-56-generic
linux-image-3.2.0-57-generic
linux-image-3.2.0-58-generic
linux-image-3.2.0-61-generic
linux-image-3.2.0-63-generic
linux-image-3.2.0-64-generic
这一切都假设内核列表list.txt
采用排序格式。
附加提示
如果你有兴趣,我为这个问答写了一个 A,标题为:如何以编程方式确定安装的最高版本内核 RPM?我在其中展示了如何使用sort -V
.
答案2
正如您提到的列表,我假设它在某个文件中。不过,该命令可以轻松修改。
一个更简单的方法是,
current_ver=$(uname -r)
awk "/$current_ver/{y=1;next}y" list
该current_ver
变量存储当前的内核版本。该awk
命令获取当前版本之后的输出。
附:
我不太精通awk
。该命令肯定可以进一步增强:)
答案3
由于我们在这里肯定使用 Linux,因此您可能会使用 GNUls
来对-v
结果进行版本排序。考虑到这一点,并且您的内核文件名不太可能包含任何奇怪的字符,您可以这样做:
ls -1v /boot/linux-image* | grep "$(uname -r)" -B1