ps 결과에 'grep'이 나타나지 않도록하려면 어떻게해야합니까?


304

존재하지 않는 프로세스를 검색하면

$ ps aux | grep fnord                          
wayne    15745  0.0  0.0  13580   928 pts/6    S+   03:58   0:00 grep fnord

분명히 나는 ​​grep에 관심이 없습니다. ps프로세스 를 검색하는 것만큼이나 의미가 있습니다!

grep이 결과에 나타나지 않게하려면 어떻게해야합니까?


28
당신은 프로세스의 PID를해야 할 경우 대체 할 수있는 ps aux |grep과 pgrep(또는 pgrep -f).
— jofel

6
Serverfault 와 Superuser 에 대해 같은 질문입니다 .
— Thor

출력이 합법입니까? fnord라는 프로그램이없는 것 같습니다 ...
— acolyte

4
@acolyte, 그것은 정확합니다. 그러나 출력을 grep에 파이핑하기 때문에 grep이 실행 중입니다 (의 출력을 기다리는 중입니다 ps aux). 그래서 질문 방지하는 방법은 grep fnord분명히 내가 관심이 아니라서 실행중인 프로세스로 나타나지에서 그 하나.
— 웨인 베르너

2
@acolyte "fnord"줄을 볼 수 없다는 것은 놀라운 일이 아닙니다. 당신은 그것을 볼 수 없어야합니다. 2 분에서 3 분 정도 여유가 있다면 검색하십시오.
— 프란체스코

답변:


439

키 체인에 해결책이 있습니다.

$ ps aux | grep "[f]nord"

문자열 주위에 대괄호를 문자와 따옴표로 묶으면 정규 표현식을 검색합니다. "문자 'f'뒤에 'nord'가 있습니다."

그러나 패턴 'f'뒤에 괄호를 넣은 뒤에 ']' grep이 표시 되므로 결과 목록에 표시되지 않습니다. 니토!


26
@acolyte : ps의 출력은로 끝나는 줄을 포함합니다 grep [f]nord. 그러나 문자열 [f]nord은 정규식과 일치하지 않으므로 grep 필터를 통해 해당 행을 작성 하지 않습니다 [f]nord.
— LarsH

9
@LarsH 재미있는, 감사합니다! 나는 제안했을 ps aux | grep fnord | grep -v grep것입니다 ... 이미 몇 사람이 이미 제안한 것 같습니다 ... lol
— acolyte

5
@progo 예, [bash로 짝수 를 인용해야합니다 . fnord현재 디렉토리에 있는 파일로 시도하십시오 .
— Gilles

25
출력을 파악하는 ps것은 오래된 트릭 일 수 있지만 신뢰할 수는 없습니다. 사용pgrep 가능한 경우.
— Gilles

8
@naxa 프로그램 호출 fnord과이라는 프로그램 이 있다고 상상해보십시오 safnorde. 또는라는 사용자가 bfnord있고 모든 프로세스가 종료됩니다. 기타
— Gilles

163

내가 사용하는 또 다른 옵션 (특히 프로세스가 실행 중인지 확인하는 것)이 pgrep 명령입니다. 일치하는 프로세스를 검색하지만 검색을위한 grep 행은 나열하지 않습니다. 나는 정규식이나 탈출을하지 않고 빠른 검색 방법이기 때문에 좋아합니다.

pgrep fnord

8
그들은 -f옵션이 더 좋아지기를 원할 것 ps | grep입니다.
— jordanm

@jordanm 실제로 pgrep -f는 다음과 같습니다 ps -f | grep.
— michelpm

5
-l일치하는 명령을 보여주기 위한 주장 도 있습니다 .
— 패트릭

15
ps | grep '[f]nord'영리하고 존경 할 만하지 만 pgrep이 옳습니다 .
— kojiro

3
ps $(pgrep cmd) ...`pgrep에 옵션이없는 경우 언제든지 할 수 있습니다 (빈 명령 집합에는 작동하지 않습니다).
— Maciej Piechotka

62

이상적인 솔루션은 BriGuy가 제시 한 솔루션입니다

pgrep fnord 

그러나 그렇게하고 싶지 않으면 grep 과 일치하는 모든 줄을 제외하면 됩니다.

ps aux | grep -v grep | grep "fnord"

7
하지만 내가 찾고있는 줄이 "bash bash grep bash"라면 어떨까요?
— Sparr

1
@Sparr 그럼 당신은 최고의 솔루션을 사용한다 : pgrep또는 다른 하나 찾을 수)
— RSFalcon7

pgrep으로 이름 길이 제한에주의하십시오. 전체 경로 이름을 얻으려면 -f를 사용하십시오. 그렇지 않으면 더 긴 이름으로 일치하는 항목을 찾을 수 없습니다. -l은 경기를 나열하기에도 좋습니다
— Neil McGill

25

가장 우아한 해결책은 아니지만 다음과 같이 할 수 있습니다.

$ ps aux | grep fnord | grep -v grep


나쁜 대답입니다! grep당신의 문구에 단어가 있다면 . 그 과정을 보여주지 않을 것입니다. 예를 들어, 명령에 foo_grep_bar.txt의해 호출 된 파일 이 편집되고 있다고 가정하십시오 nano. 프로세스가 실행 중입니다. root 14908 0.0 0.0 110012 1692 pts / 3 S + Oct31 0:00 nano foo_grep_bar.txt이 답변에 따르면 작동하지 않습니다 $ ps aux | grep nano | grep -v grep. 파일 이름에 grep 단어가 있기 때문입니다.
— Nabi KAZ

나는 이것이 받아 들여진 대답보다 의도에 대해보다 명시 적으로 선호하며 한 가지 경우를 제외하고 모두 작동합니다.
— samaspin

1
당 superuser.com/a/409658/450260 당신은 전체 제외해야 grep fnord그냥를 grep예 $ ps aux | grep fnord | grep -v "grep fnord"
— 다 보스

15

zsh에서 grep fnord =(ps aux).

아이디어는 먼저 실행 ps aux하여 결과를 파일에 넣은 다음 grep해당 파일에서 사용 하는 것입니다. zsh의 "프로세스 대체"를 사용하므로 파일이 없습니다.

설명하기 위해 시도

ps aux > ps.txt
grep fnord ps.txt
rm ps.txt

결과는 같아야합니다.

다른 답변에 대한 일반적인 의견 . 일부는 복잡하고 타이핑하기까지 먼 곳입니다. 그것은 옳은 것의 문제 일뿐만 아니라 사용 가능해야합니다. 그러나 이것이 그 해결책 중 일부가 나쁘다는 것을 의미하지는 않습니다. 사용 가능하게하려면 미니 UI 안에 싸야합니다.


1
zsh의 프로세스 대체를 모르지만 두 프로세스가 차례로 호출되고 병렬이 아닌 것이 확실합니까?
— Paŭlo Ebermann

3
@ PaŭloEbermann : 병렬은 <(command)입니다. grep grep =(ps aux)줄을 표시하지 않습니다.
— Maciej Piechotka

Zsh는 ps의 출력을“매치”할 수 있습니다. print -l ${(M)${(f)¨$(ps aux)¨}:#*fnord*}
— Friartek

7
ps aux | grep $(echo fnord | sed "s/^\(.\)/[\1]/g")

3
이것은 IOCCC처럼 보이지만 C 대신 유닉스 명령 줄의 경우 ^^ | grep $(echo fnord)충분하지 않습니까? 또한 sed에게 "fnord"의 각 문자를 검색하여 자체 값으로 바꾸라고 요청합니까? ^^ 축하합니다. 나는 더 긴 것을 할 수있을 것이지만, 아마 재미 있지 않을 것이다 ^^
— Olivier Dulac

1
위 의견의 어조가 불쾌하게 들릴 수있어 죄송합니다 (50 만 후에는 편집 할 수 없음). 귀하의 답변은 정말 기뻤으며, 나쁘게 보이려고하지 않았습니다. 난 정말 당신이 의도적으로 이렇게했다고 생각합니다 ^^
— Olivier Dulac

1
사과하지 마십시오. 귀하의 답변은 정말 재미있었습니다. 나는 pgrep -l $ 1을 의미했다;)
— yPhil

3
@OlivierDulac : 그는 첫 번째 문자를 자체 값으로 대체하지 않습니다. 그는 대괄호로 묶은 값으로 연결합니다. (대괄호는 특별하지 않으며 문자 그대로입니다.) 기본적으로 그는 Wayne Werner의 답변을 일반화하여 첫 번째 문자 주위에 대괄호를 넣는 프로세스를 스크립팅 할 수 있습니다. +1
— LarsH

2
ps aux | grep '[^]]fnord'그 체조를 피할 것입니다.
— Stéphane Chazelas

6

⚠ 이 답변은 GNU에만 해당 됩니다. 보다 일반적인 해결책 은 Wayne의 답변 을 참조하십시오 .

프로세스 검색

fnord프로세스를 찾고 있다면 -C옵션을 사용하여 명령 이름으로 선택할 수 있습니다 .

ps -C fnord

이것은 원하는대로 BSD 및 POSIX 스타일 형식 옵션과 혼합 될 수 있습니다. 전체 목록 은 ps 매뉴얼 페이지 를 참조하십시오 .

다른 것을 찾고 계십니까?

명령 이름을 정확하게 검색하는 것보다 고급 기능이 필요한 경우 희망을 잃지 마십시오! 이것은 여전히 ps파이프 측면에서 수행 할 수 있습니다 . 우리가해야 할 일은 결과에서 프로세스 ps를 제외 시키라 grep는 것입니다.

ps -NC grep | grep 'fnord'

-C grep모든 grep 프로세스를 선택 -N하고 선택을 무효화합니다. 명령 인수, 명령 이름의 일부 또는보다 복잡한 정규식을 검색하는 데 사용할 수 있습니다.


1
이것은 GNU와 잘 ps하지만, -CPOSIX에 의해 지정되지 않고 BSD에 aa는 완전히 다른 의미가
— 에릭 Renouf

그것은 실제로 BSD에 해당하는 것이 없다는 것입니다 (맥에서도 작동하지 않음을 의미합니다). ps -C를 사용하는 것이 가장 간단한 답변입니다.
— Christopher Hunter

3

내 대답은 'ps'목록에서 "foobar"를 검색하는 일반적인 대답의 변형입니다. "-A" "ps"의 주장은 "aux"보다 이식성이 뛰어나지 만이 변화는 답과 관련이 없다고 생각합니다. 일반적인 대답은 다음과 같습니다.

$ ps -A -ww | grep [f]oobar

대신이 패턴을 사용합니다.

$ ps -A -ww | grep [^]]foobar

주요 장점은 원하는 패턴으로 정적 문자열 "[^]]"을 연결하기 때문에이 패턴을 기반으로 스크립트를 작성하는 것이 더 쉽다는 것입니다. 문자열의 첫 글자를 뺄 필요가 없으며 대괄호 사이에 삽입 한 다음 다시 연결하십시오. 쉘에서 스크립팅 할 때 찾고자하는 패턴 앞에 "[^]]"를 붙이는 것이 더 쉽습니다. Bash에서 문자열 슬라이싱은 추한 일이므로 변형으로 피할 수 있습니다. 이 변형은 패턴이 앞 오른쪽 대괄호없이 일치하는 선을 보여줍니다]. 대괄호를 제외하는 검색 패턴은 실제로 대괄호를 패턴에 추가하므로 절대 일치하지 않습니다.

따라서 다음과 같이 이식 가능한 'psgrep'명령을 작성할 수 있습니다. 여기서는 Linux, OS X BSD 등의 차이점을 약간 허용합니다. 이것은 'ps'의 열 헤더를 추가하고 내 요구에 더 적합한 사용자 정의 'ps'형식을 제공하며 명령 줄 인수가 누락되지 않도록 추가 너비를 추가하여 프로세스를 표시합니다. 글쎄, 대부분은 그리워하지 않습니다. Java는 Java이기 때문에 가능한 한 최악의 방법으로 작업을 수행하므로 일부 Java 서비스는 프로세스 테이블에서 추적 할 수있는 최대 허용 길이의 인수를 초과하여 실행됩니다. 나는 이것이 1024 자라고 생각합니다. 프로세스를 시작하는 데 허용되는 명령 단독 길이는 훨씬 길지만 커널 프로세스 테이블은 1K 이상의 길이를 추적하지 않습니다. 명령이 시작되면 command-name과 argument list는

psgrep ()
{
    pattern=[^]]${1};
    case "$(uname -s)" in
        Darwin)
            ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        Linux)
            ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        *)  # other UNIX flavors get a minimalist version.
            ps -A -ww | grep -i -e ${pattern}
        ;;
    esac
}

2

가장 간단한 쉘 불가지론 적 방법은 변수에 변수를 먼저 저장하는 것입니다.

PS_OUTPUT="$(ps aux)"; echo "$PS_OUTPUT" |grep fnord

설명 : @EmanuelBerg의 grep fnord =(ps aux)답변은을 요구하지만 가장 우아합니다 zsh. rc 파일에 간단히 넣었지만 bash는 평가를 방해 해야하는 조건에도 불구하고 해당 구문에 대해 불평합니다.


내 rc 파일에서 grep의 인수를 취하는 대소 문자를 구분하지 않는 버전이 있습니다.

psl() {
  local PS_OUTPUT="$(ps auxww)"
  echo "${PS_OUTPUT%%$'\n'*}" >&2  # title, in stderr to avoid pipes
  echo "${PS_OUTPUT#*$'\n'}" |grep -i "${@:-^}"
}

코드 보행, 코드 줄당 하나의 총알 :

  • 자세한 ps출력을 캡처합니다 ( local변수가 반환 될 때 변수가 사라짐)
  • 제목에 영향을주지 않고 결과를 추가로 필터링 할 수 있도록 표준 오류의 첫 번째 행 (제목)을 표시하십시오. 대체는 말합니다 : $PS_OUTPUT첫 번째 줄 바꿈 (regex equiv :) 후에 모든 것을 가져 와서 제거하십시오 s/\n.*$//msg. 이렇게하면 제목을 잡을 수 없습니다
  • ps출력을 첫 번째 줄 (regex equiv :)을 제외한 모든 항목으로 표시하고 대소 문자를 구분하지 않고 s/^.*\n//m내용을 grep -i하여이 함수를 전달한 모든 인수 (인수가없는 경우 ^, 일치하는 행의 시작과 일치) 모두)

1

이번에는 실제 시퀀스를 사용할 시간입니다. 파이프를 사용하면 평행이됩니다.

ps aux >f && grep tmpfs <f

추악한 파일이 있기 때문에 f이전에 실행 된 프로세스의 출력을 계속 사용하려는 순차적 프로세스에 대한 구문이 없다는 것은 내 잘못이 아닙니다.

순차 연산자의 구문에 대한 제안 :

ps aux ||| grep tmpfs

일반인이 쉽게 스트림을 필터링 할 수 없기 때문에 엘리트가 시퀀스를 기반으로하지 않습니다. 컴퓨팅에서 한 단계 뒤쳐 질 것입니다.
— Acumenus

@ABB en.wikipedia.org/wiki/Communicating_sequential_processes 는 Thompson 쉘에서 끝나는 것보다 더 많은 연산자를 가지고 있습니다. 순차적 인 오퍼레이터가있을 수 있으며 종료되는 즉시 결과를 다음 프로세스에 전달합니다. 추가 연산자를 제공함으로써 "컴퓨팅에서 뒤로 물러나"는 약간 거친 것 같습니다.
— 앤 반 로섬

링크는 훌륭하지만 병렬 처리에 비해 CPU 및 메모리 (또는 디스크) 사용시 순차적 처리는 더 나쁩니다. 이 경우 먼저 모든 ps출력을 먼저 저장 해야하는 경우 grep더 많은 메모리 (또는 디스크)를 사용하고 있습니다.
— Acumenus

0

다른 사람들이 언급했듯이 pgrep 명령은 이름 및 기타 속성을 기반으로 프로세스의 PID (프로세스 ID)를 반환합니다. 예를 들어

pgrep -d, -u <username> <string>

user가 실행하는 이름과 일치하는 모든 프로세스의 쉼표 (,)로 구분 된 PID를 제공합니다 <username>. 정확한 일치 만 리턴하기 전에 -x 스위치를 사용할 수 있습니다.

ps에서 aux 옵션을 실행하는 것처럼 이러한 프로세스에 대한 자세한 정보를 얻으려면 ps와 함께 -p 옵션을 사용하면 PID를 기반으로 일치합니다. 예를 들어

ps up $(pgrep -d, -u <username> <string>)

pgrep 명령과 일치하는 모든 PID에 대한 자세한 정보를 제공합니다.


pspgrep빈 세트를 반환 하면 실패합니다 . 귀하 의 답변 을 바탕 으로이 문제를 해결하려고 시도합니다.
— Acumenus

0

다음은 프로세스 자체의 ssh-agentPID를 표시하지 않고 username의 PID를 찾는 간단한 예 grep입니다.

ps xu | grep "${USER}.*[ ]/usr/bin/ssh-agent" | awk '{print $1 $2;}'

예를 들어 ssh-agent현재 사용자 를 죽이려면 다음 명령을 사용할 수 있습니다.

kill `ps xu | grep "${USER}.*[ ]/usr/bin/ssh-agent" | awk '{print $2;}'`

편리한 별칭을 만들려면 ~ / .bashrc 또는 ~ / .zshrc 파일에 다음 코드를 추가하십시오.

function function1 () {
    ps xu | grep "$1.*$2" | awk '{print $1" "$2" "$11;}'
}
alias mygrep="function1"

그리고 여기에 alias를 사용하는 것은 모든 사람이 정규 표현식을 배우도록 강요하는 예제입니다.

. /etc/profile #to make alias usable
mygrep ${USER} ${PROCESS_PATH}
mygrep ${USER} "[f]nord"
mygrep "[f]nord"
mygrep ".*[s]shd"

추신 : 나는 우분투와 젠투에서만이 명령을 테스트했습니다.


(1) 사용자가 자신의 프로세스 중 하나를 찾고 있다고 말하는 것은 아닙니다. 사용자는 자신 이 찾고 있는 프로세스의 소유자를 모를 수 있습니다. (2)이 대답만큼이나 환상적이지만, 당신이 말하면 여전히 실패 할 것 "${USER}.* /usr/bin/ssh-agent"입니다. 당신이 말했기 때문에 작동합니다 [ ]; 즉, 당신은 단지 받아 들여진 대답의 메커니즘을 사용하고 있습니다. 당신은뿐만 아니라 수도 있습니다 grep "[s]sh-agent".
— G-Man

네 말이 맞아 (1) 나는이 페이지를 한 번에 마주 보았을 때 유용 할 수있는 것을 공유했습니다. (2) 예 나는 대답 에서처럼 정규 표현식을 사용했습니다. (3) 나는 대답이 더 좋을 때와 동일한 것으로 대답을 업데이트했지만 사용자 이름을 제공하거나 제공하지 않고 사용하는 방법과 별칭을 보여주었습니다. (4) 또한 함수를 정의하는 방법을 보여 주지만, 필요하지는 않지만 $ 1과 $ 2가 겹치지 않으므로 흥미로운 방식으로 작동합니다. 들으 번호 G 맨
— 콘스탄틴 Zagorsky

-1

다음 .bashrc 과 같이 ALIAS를 정의하면 쉽게 할 수 있습니다 .

alias grep='grep -v grep | grep'

누가 투표를했는지 또는 이유를 모르지만 pgrep이하지 않는 ps를 완전히 사용할 수 있습니다.
— opticyclic

이것은 다른 grep 프로세스를 실수로 배제 할뿐만 아니라; grep다른 경우 에도 사용법이 중단 됩니다. 시도하십시오 echo I love grep | grep love.
— trosos

@trosos 거의 11 년 동안 나는 * nix-ing .. .. 그리고 그 패턴을 사용해 본 적이 없다 ... 아마 내년에 아마도-누가 알겠는가.
— a20

-1

-x (정확한 일치) 옵션을 사용하면 나에게 도움이되었습니다. 나는 그것을 -f (전체 명령 행)와 결합하여 프로세스를 정확하게 일치시킬 수 있습니다.

pgrep -x -f "path_i_used_when_starting/cmd params_i_used"

다운 바이 팅을하는 사람이 스스로 설명 할 수 있습니까? 이것은 몇 년 동안 나 에게이 문제를 해결하기 위해 노력해 왔습니다.
— moodboom
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.