이것은 일치하는 경우 awk print 2 줄 과 관련이 있지만 내 명령에는 해결할 수없는 버퍼링 문제가 있기 때문에 더 나은 방법은 stderr을 완전히 무시하고 특정 줄이 누락 된 출력을 찾는 것입니다.
따라서 내 출력은 다음과 같습니다.
Gathering drive descriptors ...
Gathering data for drive 0 ...
Drive Model: DataTraveler 2.0
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
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
Gathering data for drive 6 ...
Drive name: id1,sd@n5000cca10152
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp: 41 C
그리고 출력 싶습니다 Drive name
누락 된 모든 드라이브 Drive Speed
및 Drive Temp
선.
출력은 다음과 같아야합니다.
Drive name: id1,sd@n5000cca8749
Drive name: id1,sd@n5000cca4607
이것은 내 능력을 넘어서는 것이지만 나는 그것을 awk
할 수 있다고 확신 하지만을 사용하도록 설정되어 awk
있지 않으며 작업을 수행하는 모든 것이 작동합니다 (GNU 도구가 없음). 감사!
정규식 및 다중 문자 (레코드 구분 기호) 를 지원하는 mawk
및 사용 :gawk
RS
awk -v RS='Gathering data' -F'\n' '/Drive name/ && !/Drive Speed/ && !/Drive Temp/{print$(NF-2)}' file
awk
이를 지원하지 않는를 사용하면 입력을 필터링하여 양식 공급과 같은 단일 문자로 바꿀 수 있습니다.
awk '/Gathering data/{$0="\f"} 1' file | awk -v RS='\f' -F'\n' '/Drive name/ && !/Drive Speed/ && !/Drive Temp/{print$(NF-2)}'
레코드 내의 행이 고정 된 순서가 아닌 경우를 생략하여 전체 레코드를 인쇄 한 {print ...}
다음 grep 등으로 출력을 필터링 할 수 있습니다.
이 접근 방식은 일치 조건이 명백한 방식 (예 : /Drive Speed: 7200 RPMs/
대신) 으로 수정 될 수 있다는 장점이 있으며 !/foo/ && !/bar/
, 전체 파일을 메모리에로드하지 않으며 가장 중요한 것은 일부를 작성할 필요가 없다는 것입니다. 둔한 상태 기계.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다