bash unix cut ps

Usando bash ps y cortar juntos



unix cut (4)

Necesito extraer los campos PID, UID y comando de ''ps'' y lo he intentado así:

ps -L un | cut -f 1,2,13

Por alguna razón, esto se comporta ya que no hay ningún comando de corte en absoluto. Simplemente devuelve la salida ps normal. Entonces, lo intenté

ps -L un | tr -s " " | cut -d " " -f 1,2,13 ps -L un | tr -s " " | cut -d " " -f 1,2,13 y esto devuelve un total sin sentido. Entonces, traté de jugar con esto y con esto:

ps -L un | tr -s " " | cut -d " " -f 2,3,14

y esto de alguna manera devuelve lo que necesito (casi, y no entiendo por qué eso casi funciona), excepto que corta el campo de comando en el medio. ¿Cómo puedo obtener lo que necesito?


¿Hay alguna razón particular para usar el corte?

Supongo que esto hará lo que quieras:

ps -eopid,uid,cmd


Puedes usar awk para limpiar tu comando, así:

ps -L u n | awk ''{ print $1,$2,$13 }''


ps está imprimiendo separadores de espacio, pero cut sin -d usa el carácter de tabulación. tr -s comprime los espacios para obtener la mayor separación que desea, pero recuerde que existe el conjunto inicial de espacios (comprimidos a uno), por lo que debe agregar 1 a cada campo. Además, hay espacios en los comandos para cada palabra. Esto debería funcionar:

ps -L u n | tr -s " " | cut -d " " -f 2,3,14-


La pregunta es qué hacer una vez que tenga una lista. Encuentro cortar kludgy, así que en lugar de cortar paso la lista a un bucle de tiempo de lectura . "While reading" reconoce valores que no están en blanco en una línea, por lo que en este ejemplo, "a" es el primer valor, "b" es el segundo y "c" es el resto de la línea. Solo me interesan los 2 primeros valores, el propietario del proceso y la ID del proceso; y básicamente abuso la declaración del caso en lugar de usar un "si". (Aunque grep filtró, no quiero eliminar procesos donde el nombre del propietario pueda estar incrustado en otra parte de la línea)

ps -ef | grep owner | grep -v grep | while read a b c; do case $a in "owner") kill -9 $b ;; esac; done