Comando para eliminar el primer número N de líneas en la entrada

11

Antecedentes

Estoy ejecutando un servidor SSH y tengo este usuario que quiero eliminar. No puedo eliminar a este usuario porque actualmente está ejecutando algunos procesos que primero debo eliminar.

Este es el canal que estoy usando actualmente para encontrar todos los identificadores de proceso del usuario que estoy usando actualmente:

ps -u user | awk '{print $1;}'

El resultado se ve así:

PID
2121
2122
2124
2125
2369
2370

Quiero canalizar esto para kill -9matar todos los procesos para poder eliminar a este estúpido usuario como este:

ps -u user | awk '{print $1;}' | sudo xargs kill -9

Pero esto no funciona debido al PIDencabezado:

kill: failed to parse argument: 'PID'

La pregunta

Estoy pensando que tiene que haber un simple comando de Unix para eliminar la primera línea de entrada.

Soy consciente de que puedo usar tailesto, pero no quiero contar cuántas líneas contiene la entrada para determinar exactamente cuántas quiero mostrar.

Estoy buscando algo como heado tailinvertido (en lugar de mostrar solo la primera / última parte de la transmisión, muestra todo menos el inicio / final de la transmisión).

Nota

Logré resolver este problema que tenía simplemente agregando | grep [[:digit:]]después de mi awkcomando, pero todavía estoy buscando una forma de eliminar la primera línea de un archivo, ya que creo que sería bastante útil en otros escenarios.

wefwefa3
fuente
Puesto que usted ya está usando awk, podrías haber excluido el registro de encabezado (línea) usando NRpor ejemplo awk 'NR>1 {print $1;}'. Mejor aún: use pgrep -uopkill -u
steeldriver
@steeldriver ¡Interesante! Responda y explique cómo funciona (el awkcomando).
wefwefa3

Respuestas:

14

NOTA: si su sistema ya tiene pgrep/ pkillentonces está reinventando la rueda aquí. Si su sistema no tiene estas utilidades, entonces debería poder formatear la salida pspara obtener la lista PID no gravada directamente, por ejemplops -u user -opid=

Si ya está usando awk, no es necesario pasar por un proceso adicional para eliminar la primera línea (registro): simplemente agregue una condición en el número de registroNR

ps -u user | awk 'NR>1{print $1;}'

Como mencionas heady tail, la fórmula que probablemente quieras en este caso estail -n +2

conductor de acero
fuente
44
tail -n +2era exactamente lo que estaba buscando!
wefwefa3
+1 para indicar que psno se imprima un encabezado -opid=, ya que eso evita que la salida aparezca nunca. Si un usuario futuro decide ordenar la pssalida en el medio de la tubería, la suposición awk / sed / tail puede romperse.
Jeff Schaller
8

Mientras escribía esta pregunta, descubrí una solución usando sed.

Eliminar una línea al comienzo de la entrada

Para eliminar una línea, use sed 1d.

Eliminar varias líneas al comienzo de la entrada

Para eliminar el Nnúmero de líneas, usesed 1,Nd

  • Para eliminar las primeras 5 líneas, use sed 1,5d

  • Para eliminar las primeras 10 líneas, use sed 1,10d

  • Para eliminar las primeras 25 líneas, use sed 1,25d

La tubería

Entonces la tubería se convierte en el escenario se convierte en:

ps -u user | awk '{print $1;}' | sed 1d | sudo xargs kill -9
                                     ^ removes the PID header
wefwefa3
fuente