일치하는 항목이 있으면 awk는 2줄을 인쇄합니다.

일치하는 항목이 있으면 awk는 2줄을 인쇄합니다.

내 출력 중 일부는 다음과 같습니다.

Gathering data for drive 1 ...
Drive name:  id1,sd@n5000cca17096
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp:  41 C

Gathering data for drive 2 ...
Drive name:  id1,sd@n5000cca24156
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp:  41 C

Gathering data for drive 3 ...
Drive name:  id1,sd@n5000cca8749
Drive Model: HUH721010AL4204
failed to get drive stats

Gathering data for drive 4 ...
Drive name:  id1,sd@n5000cca19183
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp:  41 C

Gathering data for drive 5 ...
Drive name:  id1,sd@n5000cca4607
Drive Model: HUSMH8010BSS204
failed to get drive stats

Gathering data for drive 6 ...
Drive name:  id1,sd@n5000cca10152
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp:  41 C

드라이브 통계를 반환할 수 없는(따라서 일치하는) 모든 드라이브의 "드라이브 이름"을 인쇄하고 싶습니다 failed to get drive stats.

이전 행을 얻는 방법을 알고 있습니다.

awk '$0=="failed to get drive stats" && $2>1 {print f} {f=$0}'

그러나 이것은 나에게 도움이 되지 않습니다.

원하는 출력:

Drive name:  id1,sd@n5000cca8749
Drive name:  id1,sd@n5000cca4607

편집하다:

어떤 이유로 출력이 리디렉션되면 터미널에서와 같은 방식으로 표시되지 않습니다. 내가 실행하면 :

command >out.txt 2>&1

출력 파일은 다음과 같습니다.

failed to get drive stats
failed to get drive stats

Gathering data for drive 1 ...
Drive name:  id1,sd@n5000cca17096
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp:  41 C

Gathering data for drive 2 ...
Drive name:  id1,sd@n5000cca24156
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp:  41 C

....

두 가지 awk 답변 모두 작업을 제공했지만 다른 질문이 있는 것 같습니다.

답변1

$ awk -F ':' '$1 == "Drive name" { saved = $0 } $0 == "failed to get drive stats" { print saved }' file
Drive name:  id1,sd@n5000cca8749
Drive name:  id1,sd@n5000cca4607

먼저 입력 필드 구분 기호를 로 설정합니다 :. 그런 다음 saved드라이브 이름을 지정하는 줄을 찾을 때마다 해당 줄을 변수에 저장합니다.

행이 표시되면 failed to get drive stats현재 값이 인쇄됩니다.saved

답변2

이것이 awk에 "단락 모드"가 있는 이유입니다. 필요한 것은 다음과 같습니다.

$ awk -v RS= -F'\n' '/failed to get drive stats/{print $2}' file
Drive name:  id1,sd@n5000cca8749
Drive name:  id1,sd@n5000cca4607

답변3

아래 방법을 사용해 보세요. 아주 좋습니다.

awk '{a[++i]=$0}/failed/{for(x=NR-2;x<NR;x++)print a[x]}' filename| sed -n '1~2p'

산출

Drive name:  id1,sd@n5000cca8749
Drive name:  id1,sd@n5000cca4607

관련 정보