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
grep
programa 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]irefox
incluso encontraría todos los procesos que comienzan con exactamente una letra o número y terminan en "irefox".Entonces
ps -ef | grep firefox
busca 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]irefox
para este propósito es que el shell no lo expande. Cuando el shell se expande[f]irefox
afirefox
, eso hacegrep
que se veafirefox
, y luegofirefox
es parte degrep
la cadena de comando de, exactamente como sigrep firefox
se 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 llamadofirefox
en el directorio actual , entonces la cáscara no ampliar[f]irefox
afirefox
y este método falla, es decir, lagrep
línea de laps
que 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