A common idiom in Unix is to count the lines of output in a file or pipe with
wc -l:
$ wc -l example.txt
43
$ ps -e | wc -l
97
Sometimes you want to count the number of lines of output from a grep call,
however. You might do it this way:
$ ps -ef | grep apache | wc -l
6
But grep has built-in counting of its own, with the -c option:
$ ps -ef | grep -c apache
6
The above is more a matter of good style than efficiency, but another tool with
a built-in counting option that could save you time is the oft-used uniq. The
below example shows a use of uniq to filter a sorted list into unique rows:
$ ps -eo user= | sort | uniq
105
daemon
lp
mysql
nagios
postfix
root
snmp
tom
www-data
If it would be useful to know in this case how many processes were being run
by each of these users, you can include the -c option for uniq:
$ ps -eo user= | sort | uniq -c
1 105
1 daemon
1 lp
1 mysql
1 nagios
2 postfix
78 root
1 snmp
7 tom
5 www-data
You could even sort this output itself to show the users running the most
processes first with sort -rn:
$ ps -eo user= | sort | uniq -c | sort -rn
78 root
8 tom
5 www-data
2 postfix
1 snmp
1 nagios
1 mysql
1 lp
1 daemon
1 105
Incidentally, if you’re not counting results and really do just want a list
of unique users, you can leave out the uniq and just add the -u flag to
sort:
$ ps -eo user= | sort -u
105
daemon
lp
mysql
nagios
postfix
root
snmp
tom
www-data
The above means I actually find myself using uniq with no options quite
seldom.