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.