여러 디렉터리에 있는 모든 문자열의 총 개수를 가져오시겠습니까?

여러 디렉터리에 있는 모든 문자열의 총 개수를 가져오시겠습니까?

조언을 드릴 수 있는 (희망적으로) 흥미로운 질문이 있습니다. 로그 저장에 주로 사용되는 시스템이 있습니다. 디렉토리 구조는 다음과 같습니다.

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 -lgrep

해당 파일을 지원하지 않는 경우 해당 파일을 zcat.gzip -dczcat.gz

zshGNU를 사용하면 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

관련 정보