행 발생 횟수 정렬 및 계산

행 발생 횟수 정렬 및 계산

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

이는 두 as가 -로 구분되어 있고 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:~$ 

발생순으로 출력을 정렬하려면 sortstdout을 다시 보내야 할 수도 있습니다.

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:~$ 

이 예제가 도움이 되기를 바랍니다.

관련 정보