Cada vez que ejecutamos un comando similar al siguiente, para ver el estado de un grupo de procesos, aparece el propio proceso grep
estorbando en la salida:
root@debian:~# ps aux | grep "apache" root 2507 0.0 0.0 82304 5584 ? Ss dic01 0:12 /usr/sbin/apache2 -k start root 27017 0.0 0.0 7860 876 pts/0 S+ 12:58 0:00 grep apache www-data 29399 0.0 0.0 81668 3080 ? S dic04 0:00 /usr/sbin/apache2 -k start www-data 29450 0.0 0.1 451232 8648 ? Sl dic04 0:55 /usr/sbin/apache2 -k start www-data 29451 0.0 0.1 385724 8476 ? Sl dic04 0:54 /usr/sbin/apache2 -k start
Este artículo muestra un pequeño truco con expresiones regulares para hacerlo desaparecer.
El truco consiste en encerrar una letra (cualquiera) de la cadena a buscar entre corchetes. Por ejemplo:
root@debian:~# ps aux | grep "[a]pache" root 2507 0.0 0.0 82304 5584 ? Ss dic01 0:12 /usr/sbin/apache2 -k start www-data 29399 0.0 0.0 81668 3080 ? S dic04 0:00 /usr/sbin/apache2 -k start www-data 29450 0.0 0.1 451232 8648 ? Sl dic04 0:55 /usr/sbin/apache2 -k start www-data 29451 0.0 0.1 385724 8476 ? Sl dic04 0:54 /usr/sbin/apache2 -k start
En expresiones regulares, los corchetes ([
y ]
) se utilizan para definir listas de caracteres para una posición específica (ver "Bracket Expressions" en el manual de ps
). Por ejemplo, se podría utilizar la lista [abc]
de la siguiente forma: "[abc]pache", para buscar coincidencias con las cadenas "apache", "bpache" y "cpache".
En este caso la lista posee un único caracter ([a]
), por lo cual la expresión regular "[a]pache" resulta exactamente igual a buscar la cadena "apache".
¿Qué es lo que pasa entonces para que desaparezca el proceso grep
?
La diferencia es que, al insertar corchetes, ya no hay coincidencias con la cadena "apache" en toda la línea de comando del proceso grep
(incluyendo sus parámetros).
Para entender qué sucede, veamos la siguiente expresión regular (buscar tanto "apache" como "grep"):
root@debian:~# ps aux | grep "[a]pache\|grep" root 2507 0.0 0.0 82304 5584 ? Ss dic01 0:12 /usr/sbin/apache2 -k start root 27021 0.0 0.0 7856 896 pts/0 R+ 12:58 0:00 grep [a]pache\|grep www-data 29399 0.0 0.0 81668 3080 ? S dic04 0:00 /usr/sbin/apache2 -k start www-data 29450 0.0 0.1 451232 8648 ? Sl dic04 0:55 /usr/sbin/apache2 -k start www-data 29451 0.0 0.1 385724 8476 ? Sl dic04 0:54 /usr/sbin/apache2 -k start
Como la expresión regular es evaluada por grep y no por Bash, el parámetro en la línea del comando grep
aparece de forma literal (tal como fue ingresado en la consola), lo cual es bastante lógico. Por ello ahora no aparece la cadena "apache" en la línea del comando grep
.
Por supuesto, también funciona en sistemas FreeBSD:
emi@hal9000:~ % ps aux | grep nfs root 744 0.0 0.0 8712 2164 - Is 07:27 0:00.00 nfsuserd: master (nfsuserd) root 745 0.0 0.0 8712 2168 - S 07:27 0:00.00 nfsuserd: slave (nfsuserd) root 746 0.0 0.0 8712 2168 - S 07:27 0:00.00 nfsuserd: slave (nfsuserd) root 747 0.0 0.0 8712 2168 - S 07:27 0:00.00 nfsuserd: slave (nfsuserd) root 748 0.0 0.0 8712 2168 - S 07:27 0:00.00 nfsuserd: slave (nfsuserd) emi 1656 0.0 0.0 14816 2468 2 S+ 10:28 0:00.00 grep nfs
emi@hal9000:~ % ps aux | grep "nf[s]" root 744 0.0 0.0 8712 2164 - Is 07:27 0:00.00 nfsuserd: master (nfsuserd) root 745 0.0 0.0 8712 2168 - S 07:27 0:00.00 nfsuserd: slave (nfsuserd) root 746 0.0 0.0 8712 2168 - S 07:27 0:00.00 nfsuserd: slave (nfsuserd) root 747 0.0 0.0 8712 2168 - S 07:27 0:00.00 nfsuserd: slave (nfsuserd) root 748 0.0 0.0 8712 2168 - S 07:27 0:00.00 nfsuserd: slave (nfsuserd)
Espero que les haya gustado.
Referencias
man grep