GREP는 처음 11개 값을 제외합니다.

GREP는 처음 11개 값을 제외합니다.

필터링이 필요한 대용량 로그 파일이 있습니다. 이 로그에는 이 문자열이 포함된 모든 로그를 표시 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

관련 정보