Recientemente vi esta frase:
$ ps -ef | grep [f]irefox
thorsen 16730 1 1 Jun19 ? 00:27:27 /usr/lib/firefox/firefox ...
Por lo tanto, parece devolver la lista de procesos con "firefox" en los datos pero dejando de lado el proceso grep, y por lo tanto parece más o menos equivalente a:
ps -ef |grep -v grep| grep firefox
Sin embargo, no puedo entender cómo funciona. He mirado la página man en grep y en otros lugares, pero no he encontrado una explicación.
Y para complicar el misterio si corro:
$ ps -ef | grep firefox > data
$ grep [f]irefox data
thorsen 15820 28618 0 07:28 pts/1 00:00:00 grep --color=auto firefox
thorsen 16730 1 1 Jun19 ? 00:27:45 /usr/lib/firefox/firefox ....
¡el [t] rick parece dejar de funcionar!
Alguien aquí sabrá lo que está sucediendo, estoy seguro.
Gracias.
command-line
bash
grep
Thorsen
fuente
fuente

Respuestas:
La expresión de corchetes forma parte de la coincidencia de patrones de clase de caracteres de grep con
bash shell (y también otros shells).El
grepprograma por defecto comprende las expresiones regulares básicas POSIX. Con eso puedes definir clases de personajes. Por ejemplops -ef | grep [ab9]irefox, encontraría " a irefox", " b irefox", " 9 irefox" si existieran, pero no " ab irefox".El comando
grep [a-zA-Z0-9]irefoxincluso encontraría todos los procesos que comienzan con exactamente una letra o número y terminan en "irefox".Entonces
ps -ef | grep firefoxbusca líneas confirefoxél. Dado que el proceso grep en sí mismo tiene "firefox", grep también lo encuentra. Al agregar una[], solo estamos buscando la clase de caracteres "[f]" (que consiste solo en la letra "f" y es equivalente a solo una "f" sin los corchetes). La ventaja de los corchetes ahora es que la cadena "firefox" ya no aparece en el comando grep. Por lo tanto, grep no aparecerá en el resultado de grep.Debido a que no muchas personas están familiarizadas con los corchetes como coincidencia de clase de caracteres y expresiones regulares en general, el segundo resultado puede parecer un poco misterioso.
Si desea corregir el segundo resultado, puede usarlos de esta manera:
(Referencia)
fuente
[f]es el corchete de coincidencia del patrón de expresión regular para las clases de caracteres. Como en "[a-z0-9] irefox" grep también coincidiría con "airefox" y "0irefox". Puede ver fácilmente que no es un bash incorporado ya queecho $([f])devuelve un error.[f]irefoxpara este propósito es que el shell no lo expande. Cuando el shell se expande[f]irefoxafirefox, eso hacegrepque se veafirefox, y luegofirefoxes parte degrepla cadena de comando de, exactamente como sigrep firefoxse ejecutara. Pero es bueno para mantener la coincidencia de patrones de shell en cuenta , sobre todo cuando secuencias de comandos, porque si hay un archivo llamadofirefoxen el directorio actual , entonces la cáscara no ampliar[f]irefoxafirefoxy este método falla, es decir, lagreplínea de lapsque se muestra.La razón es que la cadena
coincide con el patrón
firefox, pero la cadenano coincide con el patrón
[f]irefox(que es equivalente al patrónfirefox).Es por eso que el primer grep coincide con su propia línea de comando de proceso, mientras que el segundo no.
fuente