조언을 드릴 수 있는 (희망적으로) 흥미로운 질문이 있습니다. 로그 저장에 주로 사용되는 시스템이 있습니다. 디렉토리 구조는 다음과 같습니다.
YYYY/MM/DD/hostname/
많은 호스트 이름이 있고 각 호스트 이름 아래에는 압축된 시간별 로그(액세스, 오류 등)가 많이 있습니다.
내가 관심 있는 것은 액세스 로그에 있는 주어진 문자열의 총 개수입니다(날짜 및 호스트 이름별로 분류). 가장 좋은 접근 방식은 무엇입니까? find와 grep을 조합하여 이를 달성할 수 있습니까? 아니면 너무 복잡하고 스크립트가 필요합니까?
답변1
for d in */*/*/*; do
printf '%s: ' "$d"
zcat -- "$d/"*.gz | grep -Fc STRING
done
STRING이 포함된 행 수가 계산됩니다.
발생 횟수를 얻으려면 (GNU 가정 ) grep -Fc STRING
로 바꾸십시오 .grep -Fo STRING | wc -l
grep
해당 파일을 지원하지 않는 경우 해당 파일을 zcat
.gzip -dc
zcat
.gz
zsh
GNU를 사용하면 grep
다음과 같이 단축할 수 있습니다.
for d (*/*/*/*) zcat $d/*.gz | grep -FcH --label=$d STRING
답변2
표준 로그 분석기 없이 이 작업을 수행하려면 YYYY 디렉터리가 포함된 디렉터리의 셸에서 "한 줄"로 이 작업을 수행할 수 있습니다.
for d in */*/*; do
echo -n "$d : "
find $d -name *.log | xargs grep -c STRING
done