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