git log --no-merges --pretty=format:'COMMIT_START|%an|%B|COMMIT_END' | \ awk ' BEGIN { RS = "COMMIT_END\n"; FS = "|" } /COMMIT_START/ { author = $2 message = "" for (i = 3; i <= NF; i++) { if (i > 3) message = message "|" message = message $i } len = length(message) authors[author] += len counts[author]++ if (!min[author] || len < min[author]) min[author] = len if (len > max[author]) max[author] = len } END { for (author in authors) { avg = authors[author] / counts[author] printf "%6.1f|%-30s|(min: %d, max: %d, commits: %d)\n", avg, author, min[author], max[author], counts[author] } }' | sort -t'|' -k1 -nr | awk -F'|' '{printf "%-30s %s chars %s\n", $2, $1, $3}'