Apache
로그 파일이 있습니다 access.log
. 파일에 있는 줄 수를 어떻게 계산할 수 있나요? 예를 들어 결과 cut -f 7 -d ' ' | cut -d '?' -f 1 | tr '[:upper:]' '[:lower:]'
는 다음과 같습니다.
a.php
b.php
a.php
c.php
d.php
b.php
a.php
내가 원하는 결과는 다음과 같습니다.
3 a.php
2 b.php
1 d.php # order doesn't matter
1 c.php
답변1
| sort | uniq -c
댓글에서 언급했듯이.
파이프를 통해 sort
출력을 알파벳/숫자 순서로 구성합니다 .
uniq
이는 중복 행만 일치하기 때문에 요구 사항입니다 . 즉,
a
b
a
이 텍스트 파일에 사용 하면 uniq
다음이 반환됩니다.
a
b
a
이는 두 a
s가 -로 구분되어 있고 b
연속된 행이 아니기 때문입니다. 그러나 먼저 데이터를 알파벳순으로 정렬하면 다음과 같습니다.
a
a
b
그러면 uniq
중복 행이 제거됩니다. 옵션은 중복 수를 -c
계산 하고 다음 형식의 출력을 제공합니다.uniq
2 a
1 b
인용하다:
답변2
[your command] | sort | uniq -c | sort -nr
sort -nr
허용되는 답변이 거의 완료되었습니다. 가장 자주 발생하는 줄을 먼저 넣기 위해 끝에 추가 항목을 추가 할 수 있습니다.
고유한옵션:
-c, --count
prefix lines by the number of occurrences
유형옵션:
-n, --numeric-sort
compare according to string numerical value
-r, --reverse
reverse the result of comparisons
특별한 경우에 정렬하려는 행이 숫자인 경우 sort -gr
대신 을 사용해야 합니다 sort -nr
.논평
답변3
연관 배열을 사용할 수 있습니다앗그런 다음 -선택 사항-유형:
$ awk ' { tot[$0]++ } END { for (i in tot) print tot[i],i } ' access.log | sort
산출:
1 c.php
1 d.php
2 b.php
3 a.php
답변4
샘플은 1개뿐입니다 d.php
. 그러면 이렇게 좋은 결과가 나올 것입니다.
wolf@linux:~$ cat file | sort | uniq -c
3 a.php
2 b.php
1 c.php
1 d.php
wolf@linux:~$
4 개가 있으면 어떻게 되나요 d.php
?
wolf@linux:~$ cat file | sort | uniq -c
3 a.php
2 b.php
1 c.php
4 d.php
wolf@linux:~$
발생순으로 출력을 정렬하려면 sort
stdout을 다시 보내야 할 수도 있습니다.
wolf@linux:~$ cat file | sort | uniq -c | sort
1 c.php
2 b.php
3 a.php
4 d.php
wolf@linux:~$
역방향-r
wolf@linux:~$ cat file | sort | uniq -c | sort -r
4 d.php
3 a.php
2 b.php
1 c.php
wolf@linux:~$
이 예제가 도움이 되기를 바랍니다.