Lệnh xóa số N dòng đầu tiên trong đầu vào


11

Lý lịch

Tôi đang chạy một máy chủ SSH và có người dùng này mà tôi muốn xóa. Tôi không thể xóa người dùng này vì anh ta hiện đang chạy một vài tiến trình mà tôi cần phải giết trước.

Đây là đường ống tôi đang sử dụng hiện đang sử dụng để tìm hiểu tất cả id quá trình của người dùng tôi hiện đang sử dụng:

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

Đầu ra trông như thế này:

PID
2121
2122
2124
2125
2369
2370

Tôi muốn đặt cái này để kill -9tiêu diệt tất cả các quy trình để tôi có thể xóa người dùng ngu ngốc như thế này:

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

Nhưng điều này không hoạt động vì PIDtiêu đề:

kill: failed to parse argument: 'PID'

Câu hỏi

Tôi nghĩ rằng phải có một lệnh Unix đơn giản để loại bỏ dòng đầu vào đầu tiên.

Tôi biết rằng tôi có thể sử dụng tailcho việc này nhưng tôi không muốn đếm có bao nhiêu dòng đầu vào chứa để tìm ra chính xác số lượng tôi muốn hiển thị.

Tôi đang tìm kiếm một cái gì đó giống headhoặc tailnhưng đảo ngược (thay vì chỉ hiển thị phần đầu tiên / cuối cùng của luồng, nó sẽ hiển thị mọi thứ trừ phần đầu / cuối của luồng).

Ghi chú

Tôi đã cố gắng giải quyết vấn đề này bằng cách thêm vào | grep [[:digit:]]sau awklệnh của mình nhưng tôi vẫn đang tìm cách xóa dòng đầu tiên của tệp vì tôi nghĩ nó sẽ khá hữu ích trong các tình huống khác.


Vì bạn đã sử dụng awk, bạn có thể loại trừ bản ghi tiêu đề (dòng) bằng NRvd awk 'NR>1 {print $1;}'. Tốt hơn nữa - sử dụng pgrep -uhoặcpkill -u
Steeldo

@steel ấn thú vị! Thực hiện một câu trả lời và giải thích làm thế nào nó ( awklệnh) hoạt động.
wefwefa3

Câu trả lời:


14

LƯU Ý: nếu hệ thống của bạn đã có pgrep/ pkillthì bạn đang phát minh lại bánh xe ở đây. Nếu hệ thống của bạn không có các tiện ích này, thì bạn sẽ có thể định dạng đầu ra của psđể lấy danh sách PID không bị cản trở trực tiếp, vdps -u user -opid=

Nếu bạn đã sử dụng awk, không cần phải thực hiện quy trình bổ sung để xóa dòng đầu tiên (bản ghi): chỉ cần thêm một điều kiện vào số bản ghiNR

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

Vì bạn đề cập headtail, công thức bạn có thể muốn trong trường hợp này làtail -n +2


4
tail -n +2chính xác là những gì tôi đang tìm kiếm!
wefwefa3

+1 để nói pskhông in tiêu đề với -opid=, vì điều đó ngăn đầu ra không bao giờ hiển thị. Nếu người dùng trong tương lai quyết định sắp xếp psđầu ra ở giữa đường ống, giả định awk / sed / tail có thể bị phá vỡ.
Jeff Schaller

8

Khi tôi đang viết câu hỏi này, tôi đã tìm ra một giải pháp bằng cách sử dụng sed.

Xóa một dòng ở đầu vào

Để xóa một dòng sử dụng sed 1d.

Xóa nhiều dòng ở đầu vào

Để xóa Nsố lượng dòng sử dụngsed 1,Nd

  • Để xóa 5 dòng đầu tiên, hãy sử dụng sed 1,5d

  • Để xóa 10 dòng đầu tiên, hãy sử dụng sed 1,10d

  • Để xóa 25 dòng đầu tiên, hãy sử dụng sed 1,25d

Đường ống dẫn

Vì vậy, đường ống trở thành trong kịch bản trở thành:

ps -u user | awk '{print $1;}' | sed 1d | sudo xargs kill -9
                                     ^ removes the PID header
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.