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 -9
tuer 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- PID
tê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 tail
pour 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 head
ou tail
mais 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 awk
commande, 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.
NR
par exempleawk 'NR>1 {print $1;}'
. Mieux encore - utilisezpgrep -u
oupkill -u
awk
commande) fonctionne.Réponses:
REMARQUE: si votre système a déjà
pgrep
/pkill
alors vous réinventez la roue ici. Si votre système ne dispose pas de ces utilitaires, vous devriez pouvoir formater la sortie deps
pour 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
Puisque vous mentionnez
head
ettail
, la formule que vous voulez probablement dans ce cas esttail -n +2
la source
tail -n +2
était exactement ce que je cherchais!ps
ne pas imprimer d'en-tête-opid=
, car cela empêche la sortie de s'afficher. Si un futur utilisateur décide de trier laps
sortie au milieu du pipeline, l'hypothèse awk / sed / tail peut se briser.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
N
nombre 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:
la source