grep 명령이 작동하지 않는 이유는 무엇입니까?

grep 명령이 작동하지 않는 이유는 무엇입니까?

다음 파일이 있습니다.

DD1포함하다:

ok
stanley

DD2포함하다:

ouddd
eddi

DD3포함하다:

hello
dd1

나는 명령을 사용했다

$ grep -E dd* dd1 dd2 dd3

문자 d가 포함된 모든 줄을 가져오고 싶습니다. 그래서 나는 얻을 수 있기를 바랍니다

dd2: ouddd
dd2: eddi
dd3: dd1

하지만 난 얻었어

dd3:dd1
dd3:dd1

왜 마지막 항목(dd3:dd1)만 받는지, 왜 두 번 주는지 이해가 되지 않습니다.

답변1

사용한 정규식은 dd*셸에서 전혀 인용되지 않습니다. 이는 쉘이 이를 파일 이름 와일드카드 패턴으로 사용하고 일치하는 모든 파일 이름( dd1, dd2및 ) 으로 확장한다는 것을 의미합니다 dd3.

그래서 명령은 다음과 같습니다

grep -E dd1 dd2 dd3 dd1 dd2 dd3

이는 파일, , 및 의 grep패턴으로 작동합니다 . 한 줄이 표현식과 일치하므로 파일에서 두 줄을 얻지만 파일 목록에는 파일이 두 번 나타납니다.dd1dd2dd3dd1dd2dd3dd3

grep패턴의 확장되지 않은 부분을 쉘에 제공하려면 다음을 인용하십시오.

grep 'dd*' dd1 dd2 dd3

또는 동등하게,

grep -E 'd+' dd[123]

답변2

패턴을 인용해야 합니다. 그렇지 않으면 쉘에 의해 확장됩니다.

dd*다음으로 확장dd1 dd2 dd3

따라서 실제로 다음을 실행합니다.

grep -E dd1 dd2 dd3 dd1 dd2 dd3

당신이 원하는

grep -E 'dd*' dd1 dd2 dd3

그러나 모든 행을 얻으려면 다음을 d실행할 수 있습니다.

grep -F 'd' dd1 dd2 dd3

관련 정보