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"를 식별한 후 다음 두 줄을 삭제해야 합니다.

답변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나타내는 정규식을 포함하는 행과 일치하고 일치 항목 다음에 오는 두 행도 인쇄합니다.[0-9]*-A 2

DIMM 크기가 MB 이상으로 보고될 가능성이 있는 경우 이를 허용하도록 정규식을 업데이트할 수 있습니다. 예를 들어, MB와 GB가 모두 가능하다면 다음과 같습니다 your_output_command | grep -E "Size: [0-9]* [GM]B" -A 2.

역방향 일치를 기반으로 콘텐츠를 필터링해야 한다면 다음 질문을 던져 보세요.역방향으로 grep하고 "이전" 및 "이후" 줄을 ​​제외하는 방법가능한 답변이 있지만 원하는 것을 일치시키고 이를 기반으로 추가 라인을 포함하는 것보다 더 복잡합니다.

Malte Skoruppa의 의견을 바탕으로 답변이 업데이트되었습니다.

관련 정보