Grep 명령을 사용하여 문서 내용 구분

Grep 명령을 사용하여 문서 내용 구분

원격 컴퓨터를 업데이트하기 위한 스크립트를 작성 중이며 업데이트하기 전에 사용자가 컴퓨터를 사용하고 있는지 알고 싶습니다. 사용자 목록이 있고 모든 사용자를 위한 heredoc을 만들었습니다. 내가 만들려는 명령은 다음과 같습니다.

ps -ef | grep -f | cat <<- END
    user1
    user2
    user3
END

이것은 작동하지 않습니다. Heredoc을 사용하여 내 사용자 목록을 기반으로 ps 명령을 필터링하려면 어떻게 해야 합니까?

답변1

짧은 답변:ps -u user1,user2,user3


옵션에 인수가 필요하므로 명령 grep이 불완전합니다 -f. 귀하의 cat명령은 here 문서에서 입력을 받으므로 명령을 수정하더라도 grep해당 출력은 삭제됩니다.

하드코딩된 사용자를 찾고 있다면 다음을 사용할 수 있습니다.

ps -ef | grep alice

(이것은 좋은 접근 방식이 아니라는 점을 제외하면 나중에 설명하겠습니다.) 입력 grep은 출력입니다 ps -ef. -e여러 옵션을 전달하여 여러 검색 패턴을 전달할 수 있습니다 .

ps -ef | grep -e alice -e bob

그러면 alice또는 가 포함된 줄이 인쇄됩니다 bob. 파일에서 입력 목록을 얻으려면 이 -f옵션을 사용할 수 있지만 이 경우 파일 이름이 필요합니다.

cat <<EOF >users.txt
alice
bob
END
ps -ef | grep -f users.txt

필터링 중인 텍스트는 표준 입력을 사용하므로 검색 모드에서 다시 사용할 수 없습니다. 여러 입력을 원하는 것은 일반적인 문제이므로 일부 셸(ksh, bash, zsh)은 솔루션을 제공합니다.프로세스 교체(이게 뭐야?돈 크리스티다음을 권장합니다.코멘트):

ps -ef | grep -f <(cat <<END
alice
bob
END
)

이 방법은 사용자 목록이 복잡한 명령으로 생성된 경우 유용하지만 하드코드된 목록을 사용하면 불필요하게 복잡해집니다. 즉, grep -e alice -e bob동일한 작업을 수행합니다.


이 접근 방식의 문제점은 행의 어느 위치에서나 사용자 이름과 일치한다는 것입니다. 이 ps명령에는 특정 사용자 그룹의 프로세스만 나열하는 옵션이 있습니다. 그냥 그걸 사용하세요.

ps -u alice,bob

사용 중인 임베디드 시스템의 버전이 ps지원하지 않는 경우 지원 -u하는지 확인 -o USER하고 grep -x전체 라인을 일치시켜 사용하십시오.

busybox ps -o user | grep -x -e alice -e bob

답변2

대체적으로 추천드리고 싶습니다자일스의 대답.

POSIX 규격을 준수하는 스크립트가 필요하지만 스크립트가 ps이를 지원하지 않는 경우 -u다음 방법을 사용할 수 있습니다.

ps -ef | grep -e \
"^smtpd
^dbus
^ntp"

ps -ef즉, 파이프를 통해 출력됩니다 grep -e pattern_list. Pattern_list는 각 패턴으로 시작하여 ^줄의 시작 부분에 고정되는 여러 줄 문자열로 제공됩니다 .

관련 정보