"grep -w" 명령이 작동하지 않습니다

"grep -w" 명령이 작동하지 않습니다

다음과 같은 입력이 있습니다.

csdi_d_trs_proc_uxs1        26 24
csdi_d_tdp_process_uxs1     28 32

proc다음을 사용할 때는 다음을 포함하면 됩니다 .

grep proc filename 

두 줄 모두 출력되므로 사용해 보았지만 grep -w proc filename출력이 표시되지 않습니다.

proc어떻게 라인만 얻을 수 있고 라인은 얻을 수 없나요 process?

답변1

-wfor 플래그는 grep주어진 표현식이 전체 단어만 일치하도록 합니다.

"단어"는 "단어가 아닌 문자"(또는 줄의 시작/끝)로 둘러싸인 "단어 문자"의 문자열입니다.

귀하의 경우 문제는 _(밑줄)이 정확히 "단어 문자"이므로 proc단어만으로는 자격을 부여할 수 없다는 것입니다.

-wwith 를 사용하는 대신 grep단어를 명시적으로 구분하는 패턴을 사용하세요 _.

grep '_proc_' filename

또는 알파벳 소문자 이외의 문자로 단어를 구분하려면 다음을 [^a-z]대신 사용하세요._

grep '[^a-z]proc[^a-z]' filename

proc줄의 시작/끝에 있는 단어 는 인식되지 않습니다 .

답변2

-w, --word-regexp 전체 단어를 구성하는 항목이 포함된 행만 선택하십시오. [...] 단어를 구성하는 문자는 문자, 숫자, 밑줄입니다.

대부분의 프로그래밍 언어(적어도 C, Perl, 셸)에서 밑줄은 식별자의 일부로 유효하므로 여기서는 "단어 문자"로 간주됩니다.

단어만 일치시키는 한 가지 방법은 Perl 정규식에서 제공하는 부정 예측 및 예측 테스트를 사용하는 것입니다. 여기서 의미하는 것은 (?<![a-z])"그 앞에는 소문자가 없고 (?![a-z])그 뒤에도 유사하게 문자가 있습니다. 줄의 시작과 끝은 소문자가 아니므로 proc시작 부분에서도 일치합니다.

pcregrep '(?<![a-z])proc(?![a-z])' filename 

또는 라인의 시작과 끝을 명시적으로 고려하여 grep ERE를 사용하십시오.

grep -E '(^|[^a-z])proc([^a-z]|$)' filename

(어느 쪽이 더 예쁜지는 모르겠습니다.)

자연어 텍스트가 있는 경우 [[:alpha:]]아마도 [a-z].

그러나 물론 _proc_거기에 밑줄이 있을 것이라는 것을 알고 있다면 grep하는 것이 더 쉽습니다.

관련 정보