입력에서 첫 번째 N 줄 수를 제거하는 명령


11

배경

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명령을하지만, 난 여전히 내가 다른 시나리오에서 매우 유용하다고 생각하는 파일의 첫 줄을 삭제하는 방법을 찾고 있어요.


이미 awk를 사용하고 있으므로 NReg를 사용하여 헤더 레코드 (줄)를 제외 할 수 있습니다 awk 'NR>1 {print $1;}'. 더 나은-사용 pgrep -u또는pkill -u
스틸 드라이버

@steeldriver 흥미있는! 답을하고 그것이 어떻게 awk작동 하는지 설명하십시오 .
wefwefa3

답변:


14

참고 : 시스템에 이미 pgrep/ 가있는 경우 pkill여기에서 휠을 다시 발명합니다. 시스템에 이러한 유틸리티가없는 경우 출력을 형식화 ps하여 방해받지 않은 PID 목록을 직접 가져올 수 있어야합니다. 예 :ps -u user -opid=

이미를 사용중인 경우 awk첫 번째 행 (레코드)을 제거하기 위해 추가 프로세스를 통해 파이프 할 필요가 없습니다. 레코드 번호에 조건을 추가하기 만하면됩니다.NR

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

당신이 언급 때문에 head그리고 tail,이 경우에 당신은 아마하고자하는 공식은tail -n +2


4
tail -n +2내가 찾던 것이 바로 그 것이었다!
wefwefa3

ps출력이 나타나지 않도록하기 위해 헤더를 인쇄하지 말라고 +1 -opid=합니다. 미래의 사용자가 ps파이프 라인 중간에 출력 을 정렬하기로 결정 하면 awk / sed / tail 가정이 깨질 수 있습니다.
Jeff Schaller

8

이 질문을 쓰는 동안을 사용하여 솔루션을 찾았습니다 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.