Perintah untuk menghapus N baris pertama dalam input

11

Latar Belakang

Saya menjalankan server SSH dan memiliki pengguna ini yang ingin saya hapus. Saya tidak dapat menghapus pengguna ini karena dia sedang menjalankan beberapa proses yang harus saya bunuh terlebih dahulu.

Ini adalah saluran pipa yang saya gunakan saat ini untuk mengetahui semua id proses dari pengguna yang saya gunakan saat ini:

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

Outputnya terlihat seperti ini:

PID
2121
2122
2124
2125
2369
2370

Saya ingin mem-pipe ini untuk kill -9mematikan semua proses sehingga saya bisa menghapus pengguna bodoh ini seperti ini:

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

Tetapi ini tidak berfungsi karena PIDtajuk:

kill: failed to parse argument: 'PID'

Pertanyaan

Saya berpikir bahwa harus ada perintah Unix sederhana untuk menghapus baris input pertama.

Saya sadar bahwa saya dapat menggunakan tailini, tetapi saya tidak ingin menghitung berapa banyak baris input berisi untuk mencari tahu persis berapa banyak yang ingin saya tampilkan.

Saya mencari sesuatu seperti headatau tailtetapi terbalik (bukan hanya menampilkan bagian pertama / terakhir dari aliran itu menampilkan semuanya kecuali awal / akhir aliran).

Catatan

Saya berhasil memecahkan masalah yang saya miliki dengan hanya menambahkan | grep [[:digit:]]setelah awkperintah saya, tetapi saya masih mencari cara untuk menghapus baris pertama file karena saya pikir akan sangat berguna dalam skenario lain.

wefwefa3
sumber
Karena Anda sudah menggunakan awk, Anda bisa mengecualikan catatan tajuk (baris) menggunakan NRmis awk 'NR>1 {print $1;}'. Lebih baik lagi - gunakan pgrep -uataupkill -u
steeldriver
@steeldriver Menarik! Buat jawaban dan jelaskan cara kerjanya ( awkperintah).
wefwefa3

Jawaban:

14

CATATAN: jika sistem Anda sudah memiliki pgrep/ pkillmaka Anda menciptakan kembali roda di sini. Jika sistem Anda tidak memiliki utilitas ini, maka Anda harus dapat memformat output psuntuk mendapatkan daftar PID yang tidak terbebani secara langsung mis.ps -u user -opid=

Jika Anda sudah menggunakan awk, tidak perlu menyalurkan melalui proses tambahan untuk menghapus baris pertama (catatan): cukup tambahkan kondisi pada nomor catatanNR

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

Karena Anda menyebutkan headdan tail, rumus yang mungkin Anda inginkan dalam kasus ini adalahtail -n +2

Steeldriver
sumber
4
tail -n +2persis apa yang saya cari!
wefwefa3
+1 untuk memberi tahu psagar tidak mencetak tajuk -opid=, karena mencegah keluaran agar tidak pernah muncul. Jika pengguna di masa depan pernah memutuskan untuk mengurutkan psoutput di tengah pipa, asumsi awk / sed / tail mungkin rusak.
Jeff Schaller
8

Saat saya menulis pertanyaan ini saya menemukan solusi menggunakan sed.

Hapus satu baris di awal input

Untuk menghapus satu baris gunakan sed 1d.

Hapus beberapa baris di awal input

Untuk menghapus Njumlah baris, gunakansed 1,Nd

  • Untuk menghapus 5 baris pertama gunakan sed 1,5d

  • Untuk menghapus 10 baris pertama gunakan sed 1,10d

  • Untuk menghapus 25 baris pertama gunakan sed 1,25d

Pipa

Jadi pipa menjadi dalam skenario menjadi:

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