su salida ps -cl1
se ve así:
UID PID PPID F CPU PRI NI SZ RSS WCHAN S ADDR TTY TIME CMD
501 185 172 104 0 31 0 2453272 1728 - S ffffff80145c5ec0 ?? 0:00.00 httpd
501 303 1 80004004 0 31 0 2456440 1656 - Ss ffffff8015131300 ?? 0:11.78 launchd
501 307 303 4004 0 33 0 2453456 7640 - S ffffff8015130a80 ?? 0:46.17 distnoted
501 323 303 40004004 0 33 0 2480640 9156 - S ffffff80145c4dc0 ?? 0:03.29 UserEventAgent
por lo tanto, la última entrada de cada línea es su comando. Eso significa que puedes usar toda la potencia de las expresiones regulares para ayudarte.
El $
en una expresión regular significa el final de la cadena, por lo tanto, se puede utilizar para especificar $
que no sólo la salida debe tener Skype
en ella, se debe terminar con Skype
. Esto significa que si tiene un comando llamado Skype Controller
, no se tire hacia arriba:
ps -clx | grep 'Skype$' | awk '{print $2}' | head -1
También puede simplificar las cosas mediante el formato de ps -o
simplemente tire hacia arriba de las columnas que desea:
ps -eo pid,comm | grep 'Skype$' | awk '{print $1}' | head -1
Y, puede eliminar head
por el simple uso awk
's capacidad de seleccionar su línea para usted. En awk
, NR
es su número de registro. De esta manera usted puede hacer esto:
ps -eo pid,comm | grep 'Skype$' | awk 'NR == 1 {print $1}'
Heck, ahora que pienso en ello, podríamos eliminar la grep
también:
ps -eo pid,comm | awk '/Skype$/ {print $1; exit}'
Se trata de utilizar la capacidad de awk para utilizar expresiones regulares. Si la línea contiene la expresión regular, 'Skype $', imprimirá la primera columna, luego saldrá de
El único problema es que si tiene un comando Foo Skype
, también lo recuperará. Para eliminar eso, usted tiene que hacer un poco juego de piernas más elegante:
ps -eo pid,comm | while read pid command
do
if [[ "$command" = "Skype" ]]
then
echo $pid
break
fi
done
El while read
es la lectura de dos variables. El truco es que read
usa espacios en blanco para dividir las variables que lee. Sin embargo, dado que solo hay dos variables, la última contendrá el resto de la línea completa. Así, si el comando es controlador Skype, todo el comando será puesto en $command
a pesar de que hay un espacio en él.
Ahora, no tenemos que usar una expresión regular. Podemos comparar el comando con una igualdad.
Esto es más largo para escribir, pero en realidad está usando menos comandos y menos tuberías. Recuerde awk
está pasando por cada línea. Todo lo que haces aquí es hacerlo más explícito. Al final, esto es en realidad mucho más eficiente que lo que originalmente tenías.