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 |greppgrep(또는 pgrep -f).
jofel

6
ServerfaultSuperuser 에 대해 같은 질문입니다 .
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.