줄 발생 수 정렬 및 계산


145

나는 한 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 

25
| sort | uniq -c
Costas

3
| LC_ALL=C sort | LC_ALL=C uniq -c
Stéphane Chazelas

아, 나는 그것이 그렇게 uniq할 수 있다는 것을 몰랐다 ..
Kokizzu

모든 파이프없이 awk 로이 작업을 수행 할 수 있다고 생각하기 때문에 로그에 줄의 예가 있습니까?

괜찮아, 8.1GB의 로그 파일이 2 분에서 처리하고, 그것이 지금은 끝났다, 더 이상 더 이상이 필요하지 않습니다 : 3
Kokizzu

답변:


196
| sort | uniq -c

의견에 명시된 바와 같이.

출력을 파이핑하면 출력이 sort알파벳 / 숫자 순서 로 구성됩니다.

이는 uniq반복되는 라인에서만 일치 하기 때문에 요구 사항입니다.

a
b
a

uniq이 텍스트 파일 을 사용 하면 다음을 반환합니다.

a
b
a

두 개의 행이 연속 된 행이 아닌 두 개의 행 a으로 구분되어 있기 때문 b입니다. 그러나 먼저 데이터를 알파벳 순서로 먼저 정렬하면

a
a
b

그런 다음 uniq반복되는 줄을 제거합니다. -c의 옵션 uniq카운트 중복의 수와는 형태로 출력을 제공합니다 :

2 a
1 b

참고 문헌 :


1
유닉스와 리눅스에 오신 것을 환영합니다 :) 답변에 자세한 내용을 추가하고 왜 그리고 어떻게 작동하는지 설명하는 것을 망설이지 마십시오.
John WH Smith

1
printf '%s\n' ①.php ②.php | sort | uniq -c제공2 ①.php
Stéphane Chazelas

@ StéphaneChazelas 그게 printf가 인쇄하기 때문입니다php\nphp

4
@Jidder, 아니, 내 로케일의 문자 와 문자에 대해 정렬 순서가 정의되어 있지 않기 때문에 내 로케일 ①.php과 동일하게 ②.php정렬되기 때문 입니다. 바이트 값에 고유 한 값을 원하면 (파일 경로는 반드시 텍스트 일 ​​필요는 없음) 로케일을 C :로 수정해야합니다 . | LC_ALL=C sort | LC_ALL=C uniq -c
Stéphane Chazelas

2
결과 카운트 파일을 정렬하려면 아래의 @ eduard-florinescu 답변으로 "sort -nr"을 추가하는 것을 고려해야합니다.
Lluís Suñol

104
[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
-n옵션 에 대해 알려 주셔서 감사합니다 .
Sigur

2
좋은 대답은 다음과 같습니다 tr ' ' '\n' < $FILE | sort | uniq -c | sort -nr > wordcount.txt. 문장으로 된 파일에서 단어 수를 얻는 데 사용합니다 . 첫 번째 명령은 공백을 줄 바꿈으로 바꾸어 나머지 명령이 예상대로 작동하도록합니다.
Bar

2
위의 옵션을 사용하면 "23344"전에 "1"이 표시됩니다. sort -gr대신 사용하면 이 문제가 해결됩니다. -g: 일반 숫자에 따라 비교합니다 (대신 -n문자열 숫자에 따라 비교).
피터 자릭

@PeterJaric 큰 캐치 매우 유용한에 대해 알아야 할 -gr하지만 난의 출력이 생각하는 uniq -c그와 같은 것입니다 sort -nr의도 한대로 작동합니다
에드워드 Florinescu

3
실제로 데이터가 숫자 일 때 -gr더 잘 작동합니다. 단지 g, n은 플래그에 서로 다른이 두 가지 예를보십시오 : echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -nrecho "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -gr. 첫 번째는 잘못 정렬되지만 두 번째는 잘못 정렬되지 않습니다.
피터 자릭

9

awk 에서 연관 배열을 사용한 다음 선택적으로 sort 할 수 있습니다 .

cat access.log  | awk ' { tot[$0]++ } END { for (i in tot) print tot[i],i } ' | sort

산출:

1 c.php
1 d.php
2 b.php
3 a.php

파이프가 데이터를 전송하는 동안 발생 횟수를 어떻게 계산합니까?
user123456 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.