배경
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
.tail
tail -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