如何在 grep 中组合 -v 和 -B 开关?

如何在 grep 中组合 -v 和 -B 开关?

我有一个当前安装的内核的列表,我正在尝试 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

相关内容