배경
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'
질문
첫 번째 입력 줄을 제거하려면 간단한 유닉스 명령이 있어야한다고 생각합니다.
나는 tail
이것을 사용할 수 있다는 것을 알고 있지만 입력 할 줄이 몇 줄인지 계산하고 싶지 않습니다.
스트림의 첫 번째 / 마지막 부분 만 표시하는 대신 스트림 의 시작 / 끝을 제외한 모든 것을 표시하는 것과 비슷 head
하거나 tail
거꾸로 된 것을 찾고 있습니다.
노트
나는 단순히 추가했다이 문제를 해결하기 위해 관리 | grep [[:digit:]]
내 한 후 awk
명령을하지만, 난 여전히 내가 다른 시나리오에서 매우 유용하다고 생각하는 파일의 첫 줄을 삭제하는 방법을 찾고 있어요.
답변
참고 : 시스템에 이미 pgrep
/ 가있는 경우 pkill
여기에서 휠을 다시 발명합니다. 시스템에 이러한 유틸리티가없는 경우 출력을 형식화 ps
하여 방해받지 않은 PID 목록을 직접 가져올 수 있어야합니다. 예 :ps -u user -opid=
이미를 사용중인 경우 awk
첫 번째 행 (레코드)을 제거하기 위해 추가 프로세스를 통해 파이프 할 필요가 없습니다. 레코드 번호에 조건을 추가하기 만하면됩니다.NR
ps -u user | awk 'NR>1{print $1;}'
당신이 언급 때문에 head
그리고 tail
,이 경우에 당신은 아마하고자하는 공식은tail -n +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