포트 33001의 localhost로부터 데이터를 수신하고 다양한 API 버전이 요청된 횟수를 찾아 화면에 인쇄하는 스크립트를 개발하십시오.
예시 로그는 다음과 같습니다:
172.32.11.121 736443 /api/2.3
98.134.54.184 182294 /api/2.3
172.32.11.121 736443 /api/2.3/security
203.44.122.18 397832 /api/3.0
172.32.11.121 736443 /api/2.3
98.134.54.184 182294 /api/3.0
172.32.11.121 736443 /api/2.3/logging
172.32.11.121 736443 /api/2.3
71.11.139.205 291187 /api/2.3
172.32.11.121 736443 /api/3.0/security
98.134.54.184 182294 /api/2.3
71.11.139.205 397832 /api/3.0/logging
첫 번째 필드는 IP 주소, 두 번째 필드는 사용자 ID, 마지막 필드는 리소스 경로입니다.
답변1
파일의 데이터를 가정합니다 indata
.
$ awk '{ ++c[$NF] } END { for (i in c) print c[i], i }' indata
1 /api/2.3/logging
1 /api/3.0/security
6 /api/2.3
2 /api/3.0
1 /api/3.0/logging
1 /api/2.3/security
스크립트 awk
는 마지막 열의 데이터가 표시되는 횟수를 추적하고 끝에 이 정보의 요약을 인쇄합니다.
버전만 가져오기숫자, 사용 -F '/'
하고 $NF
로 바꾸십시오 $3
.
또는:
$ cut -d ' ' -f 3 indata | sort | uniq -c
6 /api/2.3
1 /api/2.3/logging
1 /api/2.3/security
2 /api/3.0
1 /api/3.0/logging
1 /api/3.0/security
이렇게 하면 데이터에서 공백으로 구분된 세 번째 열이 제거되고 정렬됩니다. uniq -c
그런 다음 각 고유 항목의 발생 횟수를 계산합니다.
이 변형의 버전 번호만 얻으려면 -d ' '
호출에서 로 바꾸세요.-d '/'
cut
답변2
전체 경로가 아닌 버전에만 관심이 있다고 가정합니다.
$ awk -F/ '{count[$3]++} END {for (v in count) print v, count[v]}' file
2.3 8
3.0 4
분할의 필드인 /
버전 번호는 모든 행의 세 번째 필드인 것 같습니다.