조건이 작동하지 않으면 ||를 사용하면 awk입니다.

조건이 작동하지 않으면 ||를 사용하면 awk입니다.

단어를 찾아 오류를 비교하는 스크립트를 작성하려고 합니다. 시간이 01 또는 04와 같지 않으면 잘못된 시간을 인쇄해야 합니다.

grep -e "Socket disconnected" -e "App Server collections connection state[False]" log-2019-10* |
awk '{if ((substr($2,1,2) != "04")) print (substr($2,1,8));}'
15:00:03
19:02:44
19:02:44
21:27:48
21:27:48
20:20:13
01:49:25
01:49:54

하지만 내가 사용할 때

grep -e "Socket disconnected" -e "App Server collections connection state[False]" log-2019-10* |
awk '{if ((substr($2,1,2) != "01") || (substr($2,1,2) != "04")) print (substr($2,1,8))}'

모든 타이밍을 인쇄하고 있습니다.

04:56:55
04:56:55
04:55:25
04:55:25
04:56:26
04:55:27
04:55:28
04:55:24
04:55:24
15:00:03
19:02:44
19:02:44
21:27:48
21:27:48
04:55:22
04:55:22
04:55:25
04:55:25
04:55:24
04:55:24
04:55:25
04:55:25
04:55:24
04:55:24
04:55:24
04:55:24
04:55:24
04:55:24
04:55:25
04:55:25
04:55:28
04:55:28
04:55:24
04:55:24
20:20:13
04:55:24
04:55:24
04:55:24
04:55:24
04:55:26
04:55:26
04:55:25
04:55:25
04:55:25
04:55:25
04:55:23
04:55:23
04:55:23
04:55:23
01:49:25
01:49:54
04:55:23
04:55:24
04:55:24
04:55:26
04:55:26
04:55:23
04:55:23
04:55:24
04:55:24
04:55:24
04:55:24
04:55:24
04:55:24
04:55:24
04:55:24
04:55:24
04:55:24
04:55:25
04:55:25

누구든지 나를 도와줄 수 있나요?

답변1

를 사용하는 경우 if ((substr($2,1,2) != "01") || (substr($2,1,2) != "04"))시간이 "01"이 아니거나 시간이 "04"가 아닌 경우 조건은 "01"("04" 아님) 및 "04"("01" 아님)를 포함하여 항상 true입니다. ).

다음을 사용해야 합니다 &&.

grep -e "Socket disconnected" -e "App Server collections connection state[False]" log-2019-10* |
awk '{if ((substr($2,1,2) != "01") && (substr($2,1,2) != "04")) print (substr($2,1,8))}'

생산하다

15:00:03
19:02:44
19:02:44
21:27:48
21:27:48
20:20:13

이것은 예입니다드모건의 법칙: 시간이 "01" 또는 "04"가 아닌지 확인하고 싶은 경우, !("01" || "04"), 와 동일합니다 !"01" && !"04".

그런데 grepAWK에서 수행되는 필터링을 다음과 결합할 수 있습니다.

awk '(/Socket disconnected/ || /App Server collections connection state\[False]/) && substr($2,1,2) != "01" && substr($2,1,2) != "04" { print substr($2,1,8) }' log-2019-10*

관련 정보