세 줄을 함께 처리하고 줄 끝까지 구분 기호를 찾을 때까지 프로세스를 반복합니다.

세 줄을 함께 처리하고 줄 끝까지 구분 기호를 찾을 때까지 프로세스를 반복합니다.

클러스터 상태를 확인하고 문제가 발견되면 출력의 3가지 속성을 가져와 해당 정보를 이벤트 관리 시스템으로 보내는 시나리오가 있습니다.

출력은 다음과 같습니다.

          Name : host1.domain.com
       Address : 10.10.10.1
Overall Health : DISK_ERROR
--
          Name : host2.domain.com
       Address : 10.10.10.2
Overall Health : MEMORY_ERROR
--
          Name : host3.domain.com
       Address : 10.10.10.3
Overall Health : HEALTH_GOOD
--

내가 원하는 것은 각 행을 가져오고 콜론 오른쪽에 있는 값을 가져온 다음 각 값을 변수에 할당한 다음 이를 이벤트 "메시지"에 전달하는 것입니다. 그런 다음 스크립트가 대시(또는 내가 설정할 수 있는 다른 구분 기호)에 도달하면 다시 시작하여 또 다른 이벤트 "메시지"를 생성하고 실패한 클러스터 구성원 전체에 대해 이를 반복합니다.

이것이 for 또는 while 루프인 것처럼 보이지만 어떻게 구성되어야 하는지는 잘 모르겠습니다. 최종 결과는 다음과 같습니다.

var1=host1.domain.com var2=10.10.10.1 var3=DISK_ERROR

message -remote_host -port -msg "The host $var1 at IP $var2 is experiencing an issue of a $var3"

지난 주 동안 많은 검색을 했지만 이에 대한 예를 본 적이 없습니다. 목록을 반복하는 것이 한 가지인 것 같습니다. 구분 기호를 기반으로 목록을 끝내는 것은 비슷하지만 출력에서 ​​여러 변수를 생성하고 이를 에코 또는 외부 작업 유형에 추가하는 작업 예제를 본 적이 없습니다. 그런 다음 다시 시작하여 동일한 출력의 다른 데이터 세트를 사용하여 동일한 장면을 다시 만듭니다. 파일별로 파일을 쓴 다음 각 파일을 처리하는 것을 볼 수 있지만(해당되는 경우) 현재로서는 내가 요구하는 작업을 효율적으로 수행하는 방법을 잘 모르겠습니다. 이는 불가능할 수도 있지만 데이터를 조작하는 최선의 방법에 대한 조언을 주시면 감사하겠습니다.

답변1

awk에서 빠르게 구현하십시오.

awk -F ' *: *' '$1 ~ /Name/ { n = $2 } $1 ~ /Address/ { a = $2 } $1 ~ /Overall Health/ { m = $2 } /^--$/ {printf "The host %s at IP %s is experiencing an issue of a %s\n", n, a, m}'

명령은 이 명령으로 파이프될 수 있으며, 파일에서 데이터를 읽으려면 명령 끝에 파일 이름을 입력하십시오. (작성된 대로 표준 입력의 입력을 기다립니다.)

관련 정보