아래와 같이 쉼표로 구분된 필드가 있습니다. 이는 명령의 출력입니다 nodestat
.
node mode : produce , modify time: 2014-11-22 04:23:28
node status: active , modify time: 2014-11-22 04:23:28
다음 조건이 모두 발생하면 "OK"를 인쇄하고 싶습니다.
- "노드 모드: 생성"(첫 번째 행, 첫 번째 열) 및
- "노드 상태: 활성"(두 번째 행, 첫 번째 열) 및
- 수정 시간이 어제 시간보다 짧습니다. (첫 번째 행, 두 번째 열)
그렇지 않으면 "NOT OK"를 인쇄합니다.
답변1
awk
이를 위해 다음과 같은 짧은 스크립트를 작성했습니다 .
nodestat |awk -v Yday="$(date -d "$(date -d '-1day' '+%Y-%m-%d 00:00:00')" +%s)" -F"[ ,]" \
'{ Mdate=$(NF-1)" "$NF;
dMepoch="date -d""\""Mdate"\""" +%s";
dMepoch |getline Mdate; close(dMepoch)
}
$0 ~ /node mode : produce/ && NR==1 && Mdate<Yday{tru++;next}
{print($0 ~ /node status: active/ && NR==2 && Mdate<Yday && tru)?"OK":"NOT OK";exit
}'
OK
설명하다:
- 먼저
$(date -d "$(date -d '-1day' '+%Y-%m-%d 00:00:00')" +%s)
어제 날짜를 이 형식으로 가져온 다음 이를 다음으로 변환합니다.Y-m-d 00:00:00
$(date -d '-1day' '+%Y-%m-%d 00:00:00')
에포크 시간라는 변수에 할당됩니다Yday
. - 에서는
F"[ ,]"
필드 구분자를 다음과 같이 정의합니다.반점그리고공간. - 에서는
Mdate=$(NF-1)" "$NF;
필드 구분 기호를 기반으로 마지막 두 필드를 다음과 같은 변수Mdate
만 포함하는 변수에 넣습니다.날짜, 그 다음에; - 에서는
dMepoch="date -d""\""Mdate"\""" +%s";
쉘 명령을 로 설정하고date -d""\""Mdate"\""" +%s
변수에 할당한 다음 이전 명령을 호출합니다dMepoch
.dMepoch |getline Mdate;
파이프에서 getline 사용하기그런 다음Mdate
전달된 값의 시대를 가져와 동일한 변수에 저장합니다.Mdate
- 마지막으로 우리가 연 명령을 닫아야 하므로 다음을 사용합니다.
close(dMepoch)
닫아.
이제 어제 날짜와 각 행이 읽을 에포크의 각 행에 대한 날짜가 있습니다 nodestat
. awk
나중에
$0 ~ /node mode : produce/ && NR==1 && Mdate<Yday{tru++;next}
NR==1
, 첫 번째 행 이고 수정 시간(에 저장된 에포크Mdate
)이 어제 날짜(에포크Yday
) 보다 이전 인지 확인하고 행에 해당 날짜가 포함되어 있는지 확인한node mode : produce
다음 플래그를 설정 하고 행을 실행tru++
합니다 .awk
next
두 번째 줄 에서는
print($0 ~ /node status: active/ && NR==2 && Mdate<Yday && tru)?"OK":"NOT OK";exit
동일한 수정 시간을 차단NR==2
하고 일치 항목을 포함하고tru!=0
첫 번째 줄에서 모든 조건이 충족되면 "OK"를 인쇄하고 그렇지 않으면 삼항 조건을 통해 "NOT OK"를 인쇄합니다print (condition)?if_true:if_false
.exit
첫 번째 줄이 조건을 충족하지 않을 때마다 여기에서 사용되며 처음 실행 시awk
"NOT OK"를 인쇄하고 종료합니다. 이렇게 하면 "NOT OK"가 반복되는 것을 방지할 수 있습니다.