Comando per rimuovere il primo N numero di righe nell'input


11

sfondo

Sto eseguendo un server SSH e ho questo utente che voglio eliminare. Non riesco a eliminare questo utente perché al momento sta eseguendo alcuni processi che devo prima uccidere.

Questa è la pipeline che sto utilizzando attualmente per scoprire tutti gli ID di processo dell'utente che sto utilizzando attualmente:

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

L'output è simile al seguente:

PID
2121
2122
2124
2125
2369
2370

Voglio reindirizzare questo per kill -9uccidere tutti i processi in modo da poter eliminare questo stupido utente in questo modo:

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

Ma questo non funziona a causa PIDdell'intestazione:

kill: failed to parse argument: 'PID'

La domanda

Sto pensando che ci debba essere un semplice comando Unix per rimuovere la prima riga di input.

Sono consapevole che posso usare tailper questo, ma non voglio contare quante righe contiene l'input per capire esattamente quante voglio visualizzare.

Sto cercando qualcosa di simile heado tailinvertito (invece di visualizzare solo la prima / ultima parte del flusso visualizza tutto tranne l'inizio / fine del flusso).

Nota

Sono riuscito a risolvere questo problema aggiungendo semplicemente | grep [[:digit:]]dopo il mio awkcomando ma sto ancora cercando un modo per eliminare la prima riga di un file poiché penso che sarebbe abbastanza utile in altri scenari.


Dal momento che stai già utilizzando awk, avresti potuto escludere il record di intestazione (riga) usando NRad es awk 'NR>1 {print $1;}'. Meglio ancora - usa pgrep -uopkill -u
steeldriver il

@steeldriver Interessante! Rispondi e spiega come funziona (il awkcomando).
wefwefa3,

Risposte:


14

NOTA: se il tuo sistema ha già pgrep/ pkillallora stai reinventando la ruota qui. Se il tuo sistema non ha queste utilità, allora dovresti essere in grado di formattare l'output di psottenere direttamente l'elenco PID non vincolato, ad es.ps -u user -opid=

Se stai già utilizzando awk, non è necessario eseguire il pipe attraverso un processo aggiuntivo per rimuovere la prima riga (record): aggiungi semplicemente una condizione al numero di recordNR

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

Poiché hai citato heade tail, la formula che probabilmente desideri in questo caso ètail -n +2


4
tail -n +2era esattamente quello che stavo cercando!
wefwefa3,

+1 per aver detto di psnon stampare un'intestazione con -opid=, poiché ciò impedisce che l'output venga mai visualizzato. Se un futuro utente dovesse mai decidere di ordinare l' psoutput nel mezzo della pipeline, il presupposto awk / sed / tail potrebbe rompersi.
Jeff Schaller

8

Mentre stavo scrivendo questa domanda ho trovato una soluzione usando sed.

Elimina una riga all'inizio dell'input

Per eliminare una riga utilizzare sed 1d.

Elimina più righe all'inizio dell'input

Per eliminare il Nnumero di righe utilizzaresed 1,Nd

  • Per eliminare le prime 5 righe utilizzare sed 1,5d

  • Per eliminare le prime 10 righe usare sed 1,10d

  • Per eliminare le prime 25 righe usare sed 1,25d

La pipeline

Quindi la pipeline diventa nello scenario diventa:

ps -u user | awk '{print $1;}' | sed 1d | sudo xargs kill -9
                                     ^ removes the PID header
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.