로그 파일에서 텍스트 패턴 검색

로그 파일에서 텍스트 패턴 검색

비슷한 형식의 모든 줄을 포함하는 큰 로그 파일이 있습니다. 약간 다를 수 있지만 첫 번째 ] 괄호 앞의 형식은 항상 정확히 동일합니다.

31.7.112.60 - - [26/Jan/2019:19:32:08 +0330] "GET /product/31284/%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D9%84%D8%A8%D8%A7%D8%B3%D8%B4%D9%88%DB%8C%DB%8C-%D8%AF%D8%B1%D8%A8-%D8%A7%D8%B2-%D8%AC%D9%84%D9%88-%D8%A8%D9%88%D8%B4-%D9%85%D8%AF%D9%84-BOSCH-WAW28760IR-9Kg HTTP/1.1" 200 41935 "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" "-"

두 가지 작업을 수행해야 합니다.

A) GET /product/XXXXX/ 모든 행(일부 행에는 없을 수 있음)에서 이 패턴을 검색합니다. 여기서 XXXXX는 가변 자릿수일 수 있습니다(예: 34213, 1242 또는 1423124). 그런 다음 처음 20개 제품을 순서대로 인쇄합니다. 이는 다음 형식이어야 합니다.

34286,25
33954,18
33952,17
33956,16
33953,16

B) IP 주소를 이용하여 일일 순 사용자 수를 찾아 출력한다. 이는 다음 형식이어야 합니다.

22/Jan/2019,3987
26/Jan/2019,5567 

답변1

이는 단순한 웹 서버 로그처럼 보입니다. 대답은 grep다음과 같이 간단 합니다 awk.

로그 파일의 이름을 로 지정합니다 httpd.log. 다음 복합 명령을 시도해 볼 수 있습니다.

grep -o 'GET \/product\/[^/]*\/' httpd.log |awk 'BEGIN{FS="\/"}{AA[$3]++}END{for(i in AA){print AA[i]" "i}}'|sort -n -r|awk '{print $2","$1}' |head -n20

첫 번째 부분은 중요한 텍스트가 있는 경우 이를 분리하고, 두 번째 부분은 제품 번호의 각 항목을 계산하여 결과를 인쇄하고, 세 번째 부분은 목록을 정렬하고, 마지막 두 부분은 사용자가 지정한 형식으로 인쇄합니다.

각 날짜를 구분하려면 이 명령 앞에 다른 명령을 추가하여 grep날짜를 지정할 수 있습니다.

IP 클라이언트를 필터링하려면 위에 표시된 예를 따라 직접 시도해 볼 수 있습니다.

답변2

awk -v pat="GET /product/[0-9]*" -F'[[:blank:]:[]' '
BEGIN           {PROCINFO["sorted_in"]="@val_num_desc"}
$0 ~ pat        {match($0, pat)
                 A[substr($0, RSTART+13, RLENGTH-13)]++}
!C[$5,$1]++     {D[$5]++}
END             {for(i in A){if(++j > 20) break; print i "," A[i]}
                 for(i in D) print i "," D[i]}
' file

BEGIN {PROCINFO["sorted_in"]="@val_num_desc"}- 배열 요소별로 내림차순으로 값별로 정렬을 설정합니다.
$0 ~ pat {match($0, pat);A[substr($0, RSTART+13, RLENGTH-13)]++}- 값에 포함된 제품 번호와 수량에 해당하는 키로 배열을 만듭니다.
!C[$5,$1]++ {D[$5]++}- 고유한 값을 계산합니다. 인증키는 날짜와 IP로 구성됩니다.
END {for(i in A){ if(++j > 20) break; print i "," A[i]}- A) 지점을 기준으로 배열의 처음 20개 키와 값을 인쇄합니다.
for(i in D) print i "," D[i]}- 값별로 정렬된 값과 키를 출력합니다.

마지막 날짜별로 정렬해야 하는 경우 출력을 셸 명령으로 리디렉션할 수 있습니다. 마지막 줄을 변경하십시오.

for(i in D) print i "," D[i] | "sort -rt\"/\" -k3,3 -k2,2 -k1,1"}

관련 정보