awk 스크립트 출력에서 ​​문자열을 포함하지 않는 행을 제외하는 방법은 무엇입니까?

awk 스크립트 출력에서 ​​문자열을 포함하지 않는 행을 제외하는 방법은 무엇입니까?

일반적으로 스크립팅에 완전히 익숙하지 않으며 다양한 항목에 대한 항목이 포함된 로그를 살펴보는 스크립트를 작성해 왔습니다. 제가 관심을 갖는 것은 사용자 활동(웹사이트의 로그인, 클릭 등)을 기록하는 항목입니다.

나는 (많은 도움을 받아) 다음 awk 스크립트를 함께 엮었고 사용자 이름이 포함되지 않은 줄에 출력을 인쇄한다는 점을 제외하면 거의 완벽하게 작동합니다. 제외하고 싶은데 방법을 찾을 수 없습니다(간단하다고 생각했습니다).

코드는 다음과 같습니다.

awk '
{       split($3, d, "@")
        match($0, /"username":"[^"]*"/)
        user = substr($0, RSTART + 12, RLENGTH - 13)
        c[d[1] OFS user]++
}
END {   for(i in c)
                printf("%4d %s\n", c[i], i)
}' mycompany.log | sort -k3,3 -k2,2

출력에서 사용자 이름이 포함되지 않은 모든 줄을 제외하는 방법을 잘 모르겠습니다.

다음은 사용자 이름이 포함된 줄의 예입니다.

qtp111659197-5776 - 05-26@09:37:34:240 INFO  (TimingInfoProxy.java:41)     - com.mycompany.api.ApiHandler-0>getUniqueDataBySource(data,{"has_values":false,"last_event_triggered":"","user_info":{"username":"[email protected]","orgid":"69d467a7-9786-47e1-9c12-bb40f9bfc65d","ip":"127.0.0.1"},"date_range":{"min_date":"","start_date":"","end_date":"","trending_start_date":"","trending_end_date":""},"terms":{"and_filtering":[]}},) 

다음은 다음이 없는 행의 간단한 예입니다.

main - 05-22@10:05:21:387 INFO  (ContextLoader.java:313)     - Root WebApplicationContext: initialization completed in 9519 ms

답변1

이미 다른 쉘 명령으로 파이프하고 있으므로 grep을 사용하겠습니다.

awk '
{
...
}' mycompany.log | grep -f '"username:"' | sort -k3,3 -k2,2

(사용자 이름 태그는 절대 변경되지 않기 때문에 -f를 사용합니다.)

편집: 이것이 가장 확실한 방법입니다. 틀림없이 "더 나은" 방법은 awk 자체를 사용하는 것입니다.

awk '
/\"username\":/ {
...
}' mycompany.log | sort -k3,3 -k2,2

답변2

코드에 확인 항목이 없습니다 match. 아래에서 수정하세요.

RSTART는 일치 함수를 호출하여 설정됩니다. 해당 값은 일치하는 하위 문자열이 시작되는 문자열 위치이거나, 일치하는 항목이 없으면 0입니다.

if(RSTART){
   user = substr($0, RSTART + 12, RLENGTH - 13)
   c[d[1] OFS user]++
}

관련 정보