grep에서이 까다로운 괄호 표현식은 어떻게 작동합니까?


38

나는 최근에이 하나의 라이너를 보았다 :

$ ps -ef | grep [f]irefox 

thorsen   16730     1  1 Jun19 ?        00:27:27 /usr/lib/firefox/firefox ...

따라서 데이터에 "firefox"가있는 프로세스 목록을 반환하는 것처럼 보이지만 grep 프로세스는 그대로두고 다음과 거의 같습니다.

ps -ef |grep -v grep| grep firefox

그래도 어떻게 작동하는지 이해할 수 없습니다. grep 및 다른 곳의 매뉴얼 페이지를 보았지만 설명을 찾지 못했습니다.

내가 실행하면 미스터리를 합성하기 위해 :

$ ps -ef | grep firefox  > data
$ grep [f]irefox data

thorsen   15820 28618  0 07:28 pts/1    00:00:00 grep --color=auto firefox
thorsen   16730     1  1 Jun19 ?        00:27:45 /usr/lib/firefox/firefox ....

트릭은 작동을 멈춘 것 같습니다!

여기 누군가가 무슨 일이 일어나고 있는지 알 것입니다.

감사.


흠, 이것이 맞습니까? ps -eaf | grep [fF] irefox가 더 의미가 있습니다. 이것은 정규 표현식처럼 보이고 의미하는 문자 중 하나와 일치합니다. 예를 들어 [0-9]
mbs

그래 그것은 내가 겪고있는 문제였습니다. 하나의 캐릭터 만 포함하는 캐릭터 클래스는 무의미 해 보였지만 "신비한"부작용을 일으키고있었습니다! 어쨌든 jokerdino는 좋은 설명을 제공했습니다.
Thorsen

답변:


57

대괄호 표현식은 bash 쉘 (및 기타 쉘) grep의 문자 클래스 패턴 일치의 일부입니다.

grep기본적으로 프로그램은 POSIX 기본 정규 표현식을 이해한다. 이를 통해 캐릭터 클래스를 정의 할 수 있습니다. 예를 들어 ps -ef | grep [ab9]irefox" a irefox", " b irefox", " 9 irefox"는 있지만 " ab irefox"는 없습니다 .

이 명령 grep [a-zA-Z0-9]irefox은 정확히 하나의 문자 또는 숫자로 시작하고 "irefox"로 끝나는 모든 프로세스를 찾습니다.

따라서 그 안에 ps -ef | grep firefox줄을 검색 firefox하십시오. grep 프로세스 자체에는 "firefox"가 있기 때문에 grep도이를 발견합니다. 를 추가 []하여 문자 클래스 "[f]"만 검색합니다 (문자 "f"만으로 구성되며 대괄호없이 "f"와 동일 함). 대괄호의 장점은 "firefox"라는 문자열이 더 이상 grep 명령에 나타나지 않는다는 것입니다. 따라서 grep 자체는 grep 결과에 나타나지 않습니다.

문자 클래스 일치 및 정규 표현식으로 대괄호에 익숙하지 않은 사람들이 많지 않기 때문에 두 번째 결과는 약간 신비 로울 수 있습니다.

두 번째 결과를 수정하려면 다음과 같이 사용할 수 있습니다.

ps -ef | grep [f]irefox  > data
grep firefox data

(참고)


1
흠. grep이 기회를 갖기 전에 []가 쉘에 의해 해석 된 것이었던 것은 나에게는 일어나지 않았다. 설명 주셔서 감사합니다. 모든 [m] 수량이 해결되었습니다.
Thorsen

도와 줄 수있어서 기뻐. 좋은 하루 되세요 :)
jokerdino

1
bash에서 대괄호 해당 단어와 일치하지 않는 경우 grep으로 전달됩니다 (예 : 현재 디렉토리에 "firefox"라는 파일이 없음). 그러나 grep에는 문자 클래스가 있으며 grep의 [f]는 f와 동일합니다.
Daniel Hershcovich

6
실제로이 경우 grep 전에 쉘에서 해석되지 않는다고 생각합니다. [f]문자 클래스의 정규 표현식 패턴 일치 괄호 라고 생각 합니다. "[a-z0-9] irefox"에서와 같이 grep은 "airefox"및 "0irefox"와 일치합니다. echo $([f])오류를 반환 하므로 bash 내장이 아니라는 것을 쉽게 알 수 있습니다 .
혼동

4
[f]irefox이 목적으로 작동 하는 구체적인 이유 는 쉘에 의해 확장 되지 않기 때문입니다 . 시 쉘 팽창 [f]irefoxfirefox원인이 있음을, grepfirefox, 다음 firefox의 일부입니다 grep정확히 것처럼,의 명령 문자열 grep firefox을 실행했다. 그러나 그것의 좋은 염두에 쉘 패턴 매칭을 유지하기 위해 , 특히 스크립팅 때문 이라는 파일이있는 경우 firefox현재 디렉토리에서 , 다음 셸 않는 확장 [f]irefoxfirefox 이 방법, 즉, 실패 grep에서 라인 ps표시됩니다.
Eliah Kagan

10

그 이유는 문자열이

grep firefox

패턴과 일치 firefox하지만 문자열

grep [f]irefox

패턴과 일치하지 않습니다 [f]irefox( pattern 과 동일 firefox).

그렇기 때문에 첫 번째 grep이 자체 프로세스 명령 줄과 일치하지만 두 번째 grep은 그렇지 않습니다.


이것은 내 머리가 더 아프게합니다
Pithikos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.