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

「Locator:」と「Bank Locator:」の結果は必ずしも同じではないため、「Size: No memory Installed」を識別してから、次の2行を削除する必要があります。

答え1

扱う改行文字 改行文字記録区切り記号で。 「インストール済みモジュールなし」が含まれていない一致レコード:

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表す正規表現を含む行と一致し、一致の後に続く2行も印刷します。[0-9]*-A 2

DIMMのサイズがMBを超えて報告される可能性がある場合は、正規表現を受け入れるように更新できます。たとえば、MBとGBの両方が可能な場合は、次のようになりますyour_output_command | grep -E "Size: [0-9]* [GM]B" -A 2

逆方向の一致に基づいてコンテンツをフィルタリングする必要がある場合は、次の質問をスローしてください。逆方向にgrepして「前」および「後」の行を除外する方法可能な答えがありますが、必要なものを一致させ、それに基づいて追加の行を含めるよりも複雑です。

Malte Skoruppaのコメントに基づいて回答が更新されました。

関連情報