Thomas' Tech Tips

grep trick to hide grep in ps process list

27 February 2022 - Thomas Damgaard

When using grep to filter the output of ps, you most likely end up having your grep process included in that list. Even though the grep process itself is seldomly what you want.

Example:

$ ps -ef | grep postgres
postgres  1027     1  0 08:34 ?        00:00:00 /usr/lib/postgresql/11/bin/postgres -D /var/lib/postgresql/11/main -c config_file=/etc/postgresql/11/main/postgresql.conf
postgres  1075  1027  0 08:34 ?        00:00:00 postgres: 11/main: checkpointer
postgres  1076  1027  0 08:34 ?        00:00:00 postgres: 11/main: background writer
postgres  1077  1027  0 08:34 ?        00:00:00 postgres: 11/main: walwriter
postgres  1078  1027  0 08:34 ?        00:00:00 postgres: 11/main: autovacuum launcher
postgres  1079  1027  0 08:34 ?        00:00:00 postgres: 11/main: stats collector
postgres  1080  1027  0 08:34 ?        00:00:00 postgres: 11/main: logical replication launcher
user     12865 12636  0 15:22 pts/4    00:00:00 grep --color=auto postgres

This happens because the grep process includes the grep command line which obviously includes the pattern that grep uses to filter the process list.

A neat trick to avoid having grep include itself in the process list is to put square brackets around the first letter of the pattern. Example:

$ ps -ef |grep [p]ostgres
postgres  1027     1  0 08:34 ?        00:00:00 /usr/lib/postgresql/11/bin/postgres -D /var/lib/postgresql/11/main -c config_file=/etc/postgresql/11/main/postgresql.conf
postgres  1075  1027  0 08:34 ?        00:00:00 postgres: 11/main: checkpointer   
postgres  1076  1027  0 08:34 ?        00:00:00 postgres: 11/main: background writer   
postgres  1077  1027  0 08:34 ?        00:00:00 postgres: 11/main: walwriter   
postgres  1078  1027  0 08:34 ?        00:00:00 postgres: 11/main: autovacuum launcher   
postgres  1079  1027  0 08:34 ?        00:00:00 postgres: 11/main: stats collector   
postgres  1080  1027  0 08:34 ?        00:00:00 postgres: 11/main: logical replication launcher   

Why does this work? Well, [p]ostgres instructs grep to match any line that contains the letter inside the brackets p followed by the string ostgres. And that’s the magic: now the grep command does not include postgres but it does match postgres.

Filed under: bash, grep, linux, ps, shell, tips