2010-06-15 26 views
9

Tengo la salida de estado del supervisor, con el siguiente aspecto.Cadena Parse con bash y número de extracto

frontend       RUNNING pid 16652, uptime 2:11:17 
nginx       RUNNING pid 16651, uptime 2:11:17 
redis       RUNNING pid 16607, uptime 2:11:32 

Necesito extraer el PID de nginx. Lo hice a través del comando grep -P, pero en grep remoto de la máquina se construye sin soporte de expresiones regulares perl.

Parece que sed o awk es exactamente lo que necesito, pero no estoy familiarizado con ellos.

Por favor, ayúdame a encontrar la manera de hacerlo, gracias de antemano.

Respuesta

13
sed 's/.*pid \([0-9]*\).*/\1/' 
2
$ cat $your_output | sed -s 's/.*pid \([0-9]\+\),.*/\1/' 
16652 
16651 
16607 
+0

Esto se conoce como UUOC (uso inútil del gato) – mikerobi

+0

@mikerobi: eso fue solo un ejemplo de cómo meter cosas en el comando ... él no dijo cómo tuvo su salida ... pero lo que sea . – Stephen

4

Solución con awk y cortar

[email protected]:~$ cat test 
frontend       RUNNING pid 16652, uptime 2:11:17 
nginx       RUNNING pid 16651, uptime 2:11:17 
redis       RUNNING pid 16607, uptime 2:11:32 
[email protected]:~$ awk '{print $4}' test | cut -d, -f 1 
16652 
16651 
16607 

por sólo nginx:

[email protected]:~$ grep nginx test | awk '{print $4}' | cut -d, -f 1 
16651 
+1

la limpieza final de la coma se puede hacer con: tr -d ',' – Marcin

+0

Gracias, @Marcin –

+0

no es necesario utilizar awk + cut + grep. Solo awk hará el trabajo. 'awk -F", "'/ nginx/{print $ 1}' archivo ' – ghostdog74

4

Utilizando AWK solo:

awk -F'[ ,]+' '{print $4}' inputfile 
+0

Funciona muy bien con una tubería: '$ status | grep nginx | ​​awk -F '[,] +' '{print $ 4}' -' – Keith

+2

@Keith: No es necesario conectar' grep' a 'awk'. AWK puede hacerlo todo por sí mismo: 'estado | awk -F '[,] +' '/ nginx/{print $ 4}' ' –

1

suponiendo grep que la aplicación es compatible con la opción -o, se pueden utilizar dos greps:

output \ 
    | grep -o '^nginx[[:space:]]\+[[:upper:]]\+[[:space:]]\+pid [0-9]\+' \ 
    | grep -o '[0-9]\+$' 
2

Tome un vistazo a pgrep, una variante de grep adaptado especialmente para grepping tabless proceso.