스트림에서 중복 행 수 계산


2

나는 현재 그 명령으로 아파치 로그를 파싱하고있다.

tail -f /opt/apache/logs/access/gvh-access_log.1365638400  | 
grep specific.stuff. | awk '{print $12}' | cut -d/ -f3 > ~/logs

출력은 도메인 목록입니다.

www.domain1.com
www.domain1.com
www.domain2.com
www.domain3.com
www.domain1.com

다른 터미널에서 다음 명령을 실행합니다.

watch -n 10 'cat ~/logs | sort | uniq -c | sort -n | tail -50'

출력은 다음과 같습니다.

1023 www.domain2.com
2001 www.domain3.com
12393 www.domain1.com

나는 준 실시간 아파치 통계를 모니터하기 위해 이것을 사용한다. 문제는 logs 매우 빠르게 커집니다. 다른 목적으로는 로그가 필요하지 않습니다. uniq -c.

내 질문은 : 임시 파일 사용을 피하는 방법이 있습니까? 내 자신의 카운터를 선택 언어로 직접 핸드 롤하지 않으려 고합니다. awk 마법.

내가 사용해야하기 때문에 sort스트림에서 정렬은 의미가 없으므로 (비록 uniq가 아니지만) 임시 파일을 사용해야합니다.

답변:


0

그것은 명백한 지적 수도 있지만, 당신은 이것을 시도 않았다 :

tail -f /opt/apache/logs/access/gvh-access_log.1365638400  | grep specific.stuff. | awk '{print $12}' | cut -d/ -f3 | sort | uniq | sort -n | tail -50

나는 그것이 긴 명령 줄이지만 중간 파일 생성을 배제한다는 것을 안다. 이 방법이 효과가 없다면 이유를 말해 주시면 더 의미있는 답변을 얻을 수 있습니다.


1
스트림에서 정렬을 사용하는 것이 의미가 없으므로 작동하지 않습니다. 그 이유 때문에 프로세스에서 임시 파일이 필요합니다.
cpa

당신이 시도하고 그것을 당신을 위해 작동하지 않았거나 그냥 작동하지 않을 것이라고 생각하고 있니? 임시 파일을 만드는 것은 첫 번째 명령의 출력을 두 번째 명령의 입력으로 파이프하는 것과 같습니다. 시도하지 않았다면 시도하십시오. 시도한 경우 어떤 문제가 발생 했습니까?
MelBurslan

1
왜 이것이 작동하지 않는 몇 가지 이유가 있습니다 (그리고 나는 시도했습니다) : - sort 출력을 쓰기 전에 EOF를 대기합니다. 이유가 분명해지기를 바랍니다. - tail -50 EOF에서 마지막 50 줄을 가져옵니다. 결국 결국 그것은 tail -f 아파치 로그에서 EOF는 출력되지 않습니다. 왜냐하면 파일에 계속해서 줄을 추가하기 때문입니다. 결과를 파일에 덤핑하는 것은이를 달성하는 방법입니다. 물론, 나는 할 수있다. tail 하지만 매번 로그 파일을 파싱해야하는데 이는 어리 석다.
cpa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.