Commande pour supprimer le premier nombre N de lignes en entrée


11

Contexte

J'utilise un serveur SSH et j'ai cet utilisateur que je souhaite supprimer. Je ne peux pas supprimer cet utilisateur car il exécute actuellement quelques processus que je dois d'abord tuer.

Voici le pipeline que j'utilise actuellement pour trouver tous les identifiants de processus de l'utilisateur que j'utilise actuellement:

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

La sortie ressemble à ceci:

PID
2121
2122
2124
2125
2369
2370

Je veux diriger ceci pour kill -9tuer tous les processus afin que je puisse supprimer cet utilisateur stupide comme ceci:

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

Mais cela ne fonctionne pas à cause de l'en- PIDtête:

kill: failed to parse argument: 'PID'

La question

Je pense qu'il doit y avoir une simple commande Unix pour supprimer la première ligne d'entrée.

Je suis conscient que je peux l'utiliser tailpour cela, mais je ne veux pas compter le nombre de lignes que l'entrée contient pour déterminer exactement combien je veux afficher.

Je cherche quelque chose comme headou tailmais inversé (au lieu d'afficher uniquement la première / dernière partie du flux, il affiche tout sauf le début / la fin du flux).

Remarque

J'ai réussi à résoudre ce problème que j'avais en ajoutant simplement | grep [[:digit:]]après ma awkcommande, mais je cherche toujours un moyen de supprimer la première ligne d'un fichier car je pense qu'il serait très utile dans d'autres scénarios.


Puisque vous utilisez déjà awk, vous auriez pu exclure l'enregistrement d'en-tête (ligne) en utilisant NRpar exemple awk 'NR>1 {print $1;}'. Mieux encore - utilisez pgrep -uoupkill -u
Steeldriver

@steeldriver Intéressant! Faites une réponse et expliquez comment cela (la awkcommande) fonctionne.
wefwefa3

Réponses:


14

REMARQUE: si votre système a déjà pgrep/ pkillalors vous réinventez la roue ici. Si votre système ne dispose pas de ces utilitaires, vous devriez pouvoir formater la sortie de pspour obtenir directement la liste PID non encombrée, par exempleps -u user -opid=

Si vous utilisez déjà awk, il n'est pas nécessaire de passer par un processus supplémentaire pour supprimer la première ligne (enregistrement): ajoutez simplement une condition sur le numéro d'enregistrementNR

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

Puisque vous mentionnez headet tail, la formule que vous voulez probablement dans ce cas esttail -n +2


4
tail -n +2était exactement ce que je cherchais!
wefwefa3

+1 pour indiquer de psne pas imprimer d'en-tête -opid=, car cela empêche la sortie de s'afficher. Si un futur utilisateur décide de trier la pssortie au milieu du pipeline, l'hypothèse awk / sed / tail peut se briser.
Jeff Schaller

8

Pendant que j'écrivais cette question, j'ai trouvé une solution en utilisant sed.

Supprimer une ligne au début de l'entrée

Pour supprimer une ligne, utilisez sed 1d.

Supprimer plusieurs lignes au début de l'entrée

Pour supprimer le Nnombre de lignes, utilisezsed 1,Nd

  • Pour supprimer les 5 premières lignes, utilisez sed 1,5d

  • Pour supprimer les 10 premières lignes, utilisez sed 1,10d

  • Pour supprimer les 25 premières lignes, utilisez sed 1,25d

Le pipeline

Ainsi, le pipeline devient dans le scénario devient:

ps -u user | awk '{print $1;}' | sed 1d | sudo xargs kill -9
                                     ^ removes the PID header
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.