tuo ps -cl1
uscita è simile al seguente:
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
Così, l'ultima voce in ogni linea è il vostro comando. Ciò significa che puoi utilizzare tutta la potenza delle espressioni regolari per aiutarti.
Il $
in un'espressione regolare significa che la fine della stringa, in tal modo, è possibile utilizzare $
per specificare che non solo l'uscita deve avere Skype
in esso, deve terminare con Skype
. Questo significa che se avete un comando chiamato Skype Controller
, non sarà tirarlo su:
ps -clx | grep 'Skype$' | awk '{print $2}' | head -1
È inoltre possibile semplificare le cose utilizzando il formato ps -o
di tirare solo le colonne che si desidera:
ps -eo pid,comm | grep 'Skype$' | awk '{print $1}' | head -1
E, puoi eliminare head
semplicemente usando la capacità di awk
di selezionare la tua linea per te. In awk
, NR
è il numero del tuo record. Così si potrebbe fare questo:
ps -eo pid,comm | grep 'Skype$' | awk 'NR == 1 {print $1}'
Heck, ora che ci penso, potremmo eliminare il grep
troppo:
ps -eo pid,comm | awk '/Skype$/ {print $1; exit}'
Questo sta usando la capacità di awk di usare le espressioni regolari. Se la riga contiene l'espressione regolare, 'Skype $', stamperà la prima colonna, quindi uscirà
L'unico problema è che se si ha un comando Foo Skype
, anche questo lo raccoglierà. Per eliminare questo, dovrete fare un po 'gioco di gambe più fantasia:
ps -eo pid,comm | while read pid command
do
if [[ "$command" = "Skype" ]]
then
echo $pid
break
fi
done
Il while read
sta leggendo due variabili. Il trucco è che lo read
utilizza lo spazio bianco per dividere le variabili che legge. Tuttavia, poiché ci sono solo due variabili, l'ultima conterrà il resto dell'intera linea. Pertanto, se il comando è Controller Skype, l'intero comando verrà inserito in $command
anche se è presente uno spazio.
Ora, non è necessario utilizzare un'espressione regolare. Possiamo confrontare il comando con un'uguaglianza.
Questo è più lungo da digitare, ma in realtà stai utilizzando meno comandi e meno connessioni. Ricorda che awk
sta scorrendo attraverso ogni linea. Tutto quello che stai facendo qui è renderlo più esplicito. Alla fine, questo è in realtà molto più efficiente di quello che avevi in origine.