확장 정규 표현식(ERE): 일치 항목에 패턴을 포함하지만 패턴의 특정 상위 집합을 제외하는 방법은 무엇입니까?

확장 정규 표현식(ERE): 일치 항목에 패턴을 포함하지만 패턴의 특정 상위 집합을 제외하는 방법은 무엇입니까?

명령의 매뉴얼 페이지에는 pgrep패턴이 "프로세스 이름이나 명령줄을 일치시키는 데 사용되는 확장 정규식을 지정합니다"라고 명시되어 있습니다. 분명히 확장 정규식은 원래 UNIX grep 명령에 사용된 정규식의 확장입니다.

해당 문자열을 일치시킬 수 있어야 하지만 확장 정규식을 사용하여 'myProcess'제외해야 합니다 . 'test_myProcess'처음에 나는 확장 정규식이 부정적인 LookBehind 어설션을 지원한다고 가정했고 그 결과 다음과 같은 정규식을 얻게 되었습니다 (?<!test_)(myProcess). 이것은 분명히 다른 정규식 도구와 함께 작동합니다(Regex101 웹 사이트에서 사용해 보았습니다).

그러나 이 기능을 사용하려고 하면 pgrep다음 오류가 발생합니다 Invalid preceding regular expression. 일부 확장된 정규식 페이지를 살펴본 후에는 이러한 유형의 정규식에 대해 부정적인 Lookbehind 주장이 존재하지 않는 것 같습니다(또는 적어도 이에 대한 참조를 찾을 수 없습니다). 문자열을 일치시키는 방법을 알아야 'myProcess'하지만 확장 정규식을 사용하여 "test_myProcess" 문자열을 제외해야 합니다.

편집하다: 일치하는(또는 일치하지 않는) 텍스트의 예를 원합니다. 필수 일치:

  • 내 프로세스
  • /usr/local/bin/myProcess.py
  • /usr/bin/myProcess

성냥아니요예상하다:

  • 내 프로세스를 테스트해 보세요
  • /usr/local/bin/test_myProcess.py
  • /usr/bin/test_myProcess

이제 pgrep을 두 번 실행하여 한 번은 일치 'myProcess'하고 한 번은 일치하도록 실행 'test_myProcess'하고 두 결과의 차이를 정답으로 삼을 생각입니다. 그러나 나는 대체 솔루션에 확실히 관심이 있습니다.

편집하다: 프로세스 이름 자체에는 가 포함되어 있지 않으며 'myProcess'해당 프로세스의 명령줄에만 나타납니다. 프로세스 이름은 python2.7. 또한 'myProcess'문자열의 시작이나 끝을 차지한다는 보장도 없습니다. 또한 지적한 대로 문자열이 'myProcess'존재 하면 일치시키고 싶지만 'test_myProcess'존재하면 일치하지 않습니다.

답변1

@don_crissti와 많은 논의 끝에 최종 해결책은 다음과 같습니다.

ps auxf | grep -E '[m]yProcess' | grep -vE 'test_[m]yProcess'

이는 먼저 해당 줄을 포함하는 모든 줄을 가져온 'myProcess'다음 해당 줄을 포함하지 않는 모든 줄과 일치합니다 'test_myProcess'(-v 일치를 반전함). 괄호와 결합된 -E는 grep출력에 나열될 두 프로세스가 일치하는 것을 방지하기 위한 것입니다 ps. 이는 모든 것을 지배하는 하나의 정규식을 찾는 것보다 훨씬 간단하다는 것이 밝혀졌습니다. 모두의 도움에 감사드립니다.

답변2

(?<!)Perl 정규식 연산자입니다. 표준 ERE에 대한 사양을 찾을 수 있습니다.여기.

myProcess매개변수 목록이 로 시작 하거나 를 포함하는 프로세스를 찾고 싶은 것 같습니다 /myProcess.

그래서:

pgrep -f '(^|/)myProcess'

답변3

pgrep그렇다면 이름이 "myProcess"로 시작하는 프로세스를 원하시나요 ? 그런 다음 정규식을 사용하십시오 ^myProcess.

pgrep '^myProcess'

정규식에서 이 ^문자는 뒤에 오는 내용이 문자열의 시작 부분에서 발견되어야 함을 의미합니다.

예:

$ pgrep -a app 
3267 nm-applet
3280 /usr/bin/python /usr/share/system-config-printer/applet.py
3297 /usr/lib/mate-panel/wnck-applet
3306 /usr/lib/mate-panel/clock-applet

$ pgrep -a '^app'
3280 /usr/bin/python /usr/share/system-config-printer/applet.py

관련 정보