我有一个当前安装的内核列表,我正在尝试 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
Run Code Online (Sandbox Code Playgroud)
我可以用来grep -v $(uname -r)
从此列表中删除当前正在运行的内核。但是,我似乎无法grep -v -B 1 $(uname -r)
从列表中删除当前和以前的内核。有没有办法结合-B
和-v
?还是我完全从错误的方向接近这个?
你可以使用 2 个 grep 来得到你想要的。内部将生成当前内核及其先前版本grep
的匹配“列表” 。uname -r
外部grep
将为您提供不包括这 2 个内核的列表。
$ grep -v "$(grep -B 1 "$(uname -r)" list.txt)" list.txt
Run Code Online (Sandbox Code Playgroud)
为了模拟您所拥有的内容,我已将这些内容添加到文件中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
Run Code Online (Sandbox Code Playgroud)
现在让我们假设该命令uname -r
返回此字符串:
$ uname -r
3.2.0-60-generic
Run Code Online (Sandbox Code Playgroud)
因此,当我运行此命令时,我会得到一个内核列表,减去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
Run Code Online (Sandbox Code Playgroud)
这一切都假设内核列表list.txt
采用排序格式。
如果您有兴趣,我为此问答写了一个 A,标题为:如何以编程方式确定安装的最高版本内核 RPM?我在其中展示了如何使用sort -V
.