grep cmd를 재귀적으로 실행하고 경로 이름과 결과를 인쇄합니다.

grep cmd를 재귀적으로 실행하고 경로 이름과 결과를 인쇄합니다.

각 클라이언트마다 하나씩 여러 디렉터리에 존재하는 로그 파일이 있습니다. 다음 명령을 실행하려고 합니다.

find . -iname "20140926.log" -exec cat {} \; | grep 123456 | grep 'food="100"' | wc -l

이렇게 하면 원하는 결과가 반환되지만 각 전체 경로에 대한 개별 개수가 무엇인지 알고 싶습니다. 예를 들어 나는 이것을 시도했다:

for f in "/path/*"; do
  result=`eval grep 123456 "$f/logs/20140926.log" | grep 'food="100"' | wc -l`
  echo "$f - $result" 
done

하지만 내 모든 디렉터리 목록과 최종 결과만 반환됩니다. 나는 다음과 같은 것을 기대하고 있습니다 :

/path1/log/file.log - 0
/path2/log/file.log - 2
/path3/log/file.log - 39
etc...

이렇게 하면 각 경로/파일에 대한 grep의 화장실을 볼 수 있습니다.

답변1

grep -H파일 이름이 인쇄되지만 여러 grep을 수행하므로 파일 이름을 직접 에코할 수 있습니다.

for f in $(find . -name '20140926.log'); do
    echo -n "$f "
    grep 123456 $f | grep -c 'food="100"'   # grep -c prints count of matches
done

답변2

넌 할 수있어

find . -name 20140926.log | while read file; do 
    printf "%s - " "$file "; grep 123456 $file | grep -c 'food=100' 
done

이는 공백으로 인해 파일 이름이 손상되지 않는다는 장점이 있습니다. 그러나 개행 문자와 백슬래시에서는 중단됩니다. 파일이 전혀 의미가 없는 경우 다음을 사용하세요.

find . -name 20140926.log | while read -rd '' file; do 
    printf "%s - " "$file "; grep 123456 "$file" | grep -c 'food=100'      
done

관련 정보