如何删除 BASH 中特定 grep 行之后的行

如何删除 BASH 中特定 grep 行之后的行

我有 Linux 的输出。

Size: 8192 MB
Locator: CPU0
Bank Locator: DIMM01

Size: No Module Installed
Locator: CPU0
Bank Locator: DIMM02

Size: 8192 MB
Locator: CPU0
Bank Locator: DIMM03

Size: No Module Installed
Locator: CPU0
Bank Locator: DIMM04

Size: 8192 MB
Locator: CPU0
Bank Locator: DIMM05

Size: No Module Installed
Locator: CPU0
Bank Locator: DIMM06

Size: 8192 MB
Locator: CPU1
Bank Locator: DIMM07

Size: No Module Installed
Locator: CPU1
Bank Locator: DIMM08

Size: 8192 MB
Locator: CPU1
Bank Locator: DIMM09

Size: No Module Installed
Locator: CPU1
Bank Locator: DIMM10

Size: 8192 MB
Locator: CPU1
Bank Locator: DIMM11

Size: No Module Installed
Locator: CPU1
Bank Locator: DIMM12

这是为了诊断 DIMM。我想删除 DIMM 中显示“未安装模块”的输出。因此,当我运行命令时,它将如下所示:

Size: 8192 MB
Locator: CPU0
Bank Locator: DIMM01

Size: 8192 MB
Locator: CPU0
Bank Locator: DIMM03

Size: 8192 MB
Locator: CPU0
Bank Locator: DIMM05

Size: 8192 MB
Locator: CPU1
Bank Locator: DIMM07

Size: 8192 MB
Locator: CPU1
Bank Locator: DIMM09

Size: 8192 MB
Locator: CPU1
Bank Locator: DIMM11

“定位器:”和“银行定位器:”结果并不总是相同,因此我需要识别“大小:未安装内存”,然后删除以下两行。

答案1

对待换行符 换行符作为记录分隔符。匹配不包含“No Module Installed”的记录:

awk 'BEGIN { RS="\n\n"; ORS=RS } !/No Module Installed/' dimmsfile

答案2

使用sed

sed '/Size: No Module Installed/,/^$/d' file

答案3

如果它适合您,一种更简单的方法是仅显示包含有效大小的行的信息,然后在其上方包含 2 行(如果需要空白行,则包含 3 行)。根据上面的输出,这将很简单: your_output_command | grep -E "Size: [0-9]* MB" -A 2

这将匹配包含正则表达式的行Size: [0-9]* MB,其中[0-9]*表示任意数量的数字,并且因为还会-A 2打印出匹配后的两行。

如果报告的 DIMM 大小有可能不仅仅以 MB 为单位,则可以更新正则表达式以允许这种情况。例如,如果 MB 和 GB 都是可能的,那么它将是:your_output_command | grep -E "Size: [0-9]* [GM]B" -A 2

如果您确实需要根据反向匹配来过滤内容,我认为这个问题:如何 grep 反向匹配并排除“之前”和“之后”行有可行的答案,但它比仅匹配您想要的内容并包含基于此的其他行要复杂得多。

答案根据 Malte Skoruppa 的评论更新

相关内容