배경

배경

배경

SSH 서버를 실행 중이고 삭제하고 싶은 사용자가 있습니다. 이 사용자는 현재 먼저 종료해야 하는 일부 프로세스를 실행하고 있기 때문에 삭제할 수 없습니다.

이것은 현재 사용 중인 사용자의 모든 프로세스 ID를 찾기 위해 사용하고 있는 파이프라인입니다.

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

출력은 다음과 같습니다.

PID
2121
2122
2124
2125
2369
2370

파이프를 통해 모든 프로세스를 종료하여 kill -9다음과 같이 이 어리석은 사용자를 제거하고 싶습니다.

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

PID하지만 헤더가 다음과 같기 때문에 작동하지 않습니다 .

kill: failed to parse argument: 'PID'

질문

입력의 첫 번째 줄을 제거하려면 간단한 Unix 명령이 있어야 한다고 생각합니다.

이 목적 으로 사용할 수 있다는 것을 알고 있지만 tail표시하려는 행 수를 정확하게 파악하기 위해 입력에 포함된 행 수를 계산하고 싶지 않습니다.

head나는 다음 과 같은 것을 찾고 있습니다 tail. 그러나 반전된(표시하는 대신)오직스트림의 첫 번째/마지막 부분을 보여줍니다.하지만 모든 것스트림 시작/끝).

노트

| grep [[:digit:]]간단히 command 뒤에 추가하여 이 문제를 해결할 수 있었지만 awk, 다른 상황에서 유용할 것이라고 생각하여 파일의 첫 번째 줄을 제거하는 방법을 여전히 찾고 있습니다.

답변1

참고: 시스템에 이미 pgrep/ 가 있는 경우 pkill여기에서 휠을 재발명하는 것입니다. 시스템에 이러한 유틸리티가 없으면 ps차단되지 않은 PID 목록을 직접 가져오도록 출력 형식을 지정할 수 있습니다.ps -u user -opid=

이미 사용하고 계시다면 awk첫 번째 행(레코드)을 삭제하기 위해 별도의 과정을 거치실 필요 없이 레코드 번호에 조건만 추가하시면 됩니다.NR

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

당신이 언급했으므로 이 경우에 원하는 공식은 다음과 같습니다 head.tailtail -n +2

답변2

이 질문을 작성할 때 사용한 솔루션이 떠올랐습니다 sed.

입력으로 시작하는 줄 삭제

행을 삭제하려면 를 사용하세요 sed 1d.

입력으로 시작하는 여러 줄 삭제

N행 수를 제거하려면 다음을 사용하십시오.sed 1,Nd

  • 처음 5개 행을 삭제하려면 다음을 사용하세요.sed 1,5d

  • 처음 10개 행을 삭제하려면 다음을 사용하세요.sed 1,10d

  • 처음 25개 행을 삭제하려면 다음을 사용하세요.sed 1,25d

관로

따라서 장면의 파이프라인은 다음과 같습니다.

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

관련 정보