Contributed by Wes Morgan
While tuning our mail system, we needed to take a "snapshot" of the users' mailboxes at regular intervals over a 30-day period. This script simply calculates the average size and prints the arithmetic distribution of user mailboxes.
#! /bin/sh # # mailavg - average size of files in /usr/mail # # Written by Wes Morgan, [email protected], 2 Feb 90 ls -Fs /usr/mail | awk ' { if(NR != 1) { total += $1; count += 1; size = $1 + 0; if(size == 0) zercount+=1; if(size > 0 && size <= 10) tencount+=1; if(size > 10 && size <= 19) teencount+=1; if(size > 20 && size <= 50) uptofiftycount+=1; if(size > 50) overfiftycount+=1; } } END { printf("/usr/mail has %d mailboxes using %d blocks,", count,total) printf("average is %6.2f blocks\n", total/count) printf("\nDistribution:\n") printf("Size Count\n") printf(" O %d\n",zercount) printf("1-10 %d\n",tencount) printf("11-20 %d\n",teencount) printf("21-50 %d\n",uptofiftycount) printf("Over 50 %d\n",overfiftycount) }' exit 0
Here's a sample output from mailavg:
$ mailavg /usr/mail has 47 mailboxes using 5116 blocks, average is 108.85 blocks Distribution: Size Count O 1 1-10 13 11-20 1 21-50 5 Over 50 27
This administrative program is similar to the filesum program in Chapter 7, "Writing Scripts for awk". It processes the output of the ls command.
The conditional expression "NR != 1" could have been put outside the main procedure as a pattern. While the logic is the same, using the expression as a pattern clarifies how the procedure is accessed, making the program easier to understand.
In that procedure, Morgan uses a series of conditionals that allow him to collect distribution statistics on the size of each user's mailbox.
Copyright © 2003 O'Reilly & Associates. All rights reserved.