필터링이 필요한 대용량 로그 파일이 있습니다. 이 로그에는 이 문자열이 포함된 모든 로그를 표시 dns
하고 한 번만 보고 싶습니다.
지금 바로:
Dec 9 07:24:02 94.15.218.140 syslog: ssk:548.049:is_dns_hijack:1451:isDnsHijack=0
Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.217:cmsLck_acquireLockWithTimeoutTraced:98:acquired lock. callerFuncName is_dns_hijack; timeout 12000 milliseconds
Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.218:cmsLck_releaseLockTraced:144:lock hold time=0ms, acquiring lock callerFuncName is_dns_hijack; releasing lock callerFuncName is_dns_hijack;
Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.225:is_dns_hijack:1425:isDnsHijack=0
Dec 9 07:24:17 94.15.218.140 syslog: ssk:563.048:cmsLck_acquireLockWithTimeoutTraced:95:acquired lock. callerFuncName is_dns_hijack; timeout 12000 milliseconds
Dec 9 07:24:17 94.15.218.140 syslog: ssk:563.048:cmsLck_releaseLockTraced:141:lock hold time=0ms, acquiring lock callerFuncName is_dns_hijack; releasing lock callerFuncName is_dns_hijack;
Dec 9 07:24:17 94.15.218.140 syslog: ssk:563.049:is_dns_hijack:1451:isDnsHijack=0
이와 관련하여:
Dec 9 07:24:02 94.15.218.140 syslog: ssk:548.049:is_dns_hijack:1451:isDnsHijack=0
Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.217:cmsLck_acquireLockWithTimeoutTraced:98:acquired lock. callerFuncName is_dns_hijack; timeout 12000 milliseconds
Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.218:cmsLck_releaseLockTraced:144:lock hold time=0ms, acquiring lock callerFuncName is_dns_hijack; releasing lock callerFuncName is_dns_hijack;
기본적으로 타임스탬프가 다르기 때문에 동일한 로그가 여러 번 반복됩니다.
을 사용하려고 했지만 uniq
그렇게 하려면 세 번째 열의 타임스탬프를 제거해야 합니다( 로 수행 가능 awk '{ $3=""; print }'
). 그러나 로그에서 볼 수 있듯이 처음 11자가 다릅니다(예: ssk:563.048
- ssk:563.049
). 나는 grep
단어에 대한 연산을 수행 dns
하고 처음 11개 값을 무시하려고 생각하고 있습니다.
어떻게 해야 하나요? 더 좋은 방법이 있나요?
답변1
필드 구분 기호로 awk
및를 사용합니다 . :
그런 다음 각 고유 오류 메시지(6번째 필드)를 배열에 저장하고 첫 번째 발생만 인쇄할 수 있습니다.
$ awk -F: '!a[$6]++' file
Dec 9 07:24:02 94.15.218.140 syslog: ssk:548.049:is_dns_hijack:1451:isDnsHijack=0
Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.218:cmsLck_releaseLockTraced:144:lock hold time=0ms, acquiring lock callerFuncName is_dns_hijack; releasing lock callerFuncName is_dns_hijack;
Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.217:cmsLck_acquireLockWithTimeoutTraced:98:acquired lock. callerFuncName is_dns_hijack; timeout 12000 milliseconds
a
위 스크립트는 6번째 필드( )에 대한 값이 저장되지 않은 경우에만 각 행을 연관 배열의 항목으로 저장합니다 !a[$6]
. 기본 작업은 awk
일부 결과가 true일 때 인쇄하는 것이므로 이렇게 하면 처음으로 발생한 고유한 항목만 인쇄됩니다.
일치하는 행에 대해서만 이 작업을 수행하려면 다음을 dns
사용하세요.
awk -F: '!a[$6]++ && /dns/' file
11번째 줄을 무시하는 경우 다음과 같이 할 수 있습니다.
grep dns file | tail -n +12