grep에서 첫 번째 일치 항목을 얻는 방법은 무엇입니까?

grep에서 첫 번째 일치 항목을 얻는 방법은 무엇입니까?

스크립트를 작성하여 변수로 사용하고 있습니다.

RESULT1=`ps -ef | grep -w "PHANTOM PHA-WRM-EXPIRE"`.

ps두 개의 PID가 나열 됩니다 .

[xhobando@noitu TNOITU]$ ps -ef | grep -w "/usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE"
phantomxg      7250     1  0 12:15 ?        00:00:01 /usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE

phantomxg    17071     1  0 Oct04 ?        00:05:27 /usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE

여기서 달성하고 싶은 것은 grep옵션이 둘 다 아닌 첫 번째 PID만 찾는다는 것입니다.

이것이 의미가 있는지 알려주세요.

답변1

PCRE 지원과 함께 GNU 사용 grep(rhel에서 구현):

ps -Ao pid= -o args= |
  grep -Pom1 '^\s*\K\d+(?= \Q/usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE\E)'

어디

  • -PPerl과 유사한 정규식 으로 전환합니다 ( \s, \K, \d, (?=...), \Q, \E모든 Perl과 유사한 확장의 경우).
  • -ogrep일치하는 부분만 출력하도록 지시합니다 .
  • -m1grep일치하는 첫 번째 줄만 출력하도록 지시합니다 .

(세 가지 플래그는 모두 GNU 확장이지만 GNU는 RHEL에서 발견된 구현 grep입니다 .)grep

ps -f신경 쓰지 않는 일부 필드를 인쇄하는 대신 필요한 필드만 선택하고( 접미사 pid는 헤더를 제거하는 것임) 명령줄에서 더 쉽게 일치시킬 수 있습니다.args=

여기서 정규식은 ^0개 이상의 ( *) 공백 문자 ( ) 로 구성된 일련의 선행 ( )을 찾은 다음 일치의 시작을 표시하고 ( ), 그 뒤에 \s1개 이상의 ( ) 숫자로 \K구성된 시퀀스 ( )를 찾습니다. 시퀀스 뒤에는 공백과 원하는 인수(정규식 연산자 목록을 포함할 수 있는 다른 인수로 대체하기 쉽도록...로 인용)가 따라옵니다(일치의 일부가 아닌 미리보기 연산자).+\d(?=...)\Q\E

아니면 그냥 사용하세요 pgrep:

pgrep -f '^/usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE' | head -n 1

인수 목록(공백 문자로 연결됨)이 로 시작하는 첫 번째 프로세스의 pid를 반환합니다 /usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE.

ps프로세스는 또는 기본적으로 출력에서 ​​pid를 기준으로 숫자순으로 정렬되며 pgrep, pid 숫자는 최대값에 도달하면 줄 바꿈되므로 얻게 되는 숫자는 다소 무작위입니다.

--sort start_time예 를 --sort -start_time들어 ps 시작 시간별로 정렬하거나 -o/를 추가할 수 있습니다.-n가장 오래된/최신 정보pgrep제거 | head -n 1) 가장 최근에 시작된 프로세스임을 보장하는 대신 가장 빠른/최근에 시작된 프로세스를 얻으려는 경우처형된udt첫 번째/마지막 프로세스는 수명 동안 여러 명령을 실행할 수 있으며 종종 실행합니다.

질문에 대한 귀하의 의견에서 알 수 있듯이 현재 작업 디렉토리를 기반으로 프로세스를 선택하려면 다음 zsh방법을 사용할 수 있습니다.

pids=(
  /proc/<1->(e[$'[[ $REPLY/cwd -ef /tdata/PHANTOM &&
    $(<$REPLY/cmdline) = /usr/ud/bin/udt\0PHANTOM\0PHA-WRM-EXPIRE\0* ]]']:t)
)

여기에서 처음 3개의 인수로 /tdata/PHANTOM, 및 가 있는 프로세스를 찾으세요 ./usr/ud/bin/udtPHANTOMPHA-WRM-EXPIRE

그러나 프로세스에 슈퍼유저 권한이 없으면 자신의 프로세스의 작업 디렉터리만 찾을 수 있습니다.

관련 정보