다음 파일이 있습니다.
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
패턴으로 작동합니다 . 한 줄이 표현식과 일치하므로 파일에서 두 줄을 얻지만 파일 목록에는 파일이 두 번 나타납니다.dd1
dd2
dd3
dd1
dd2
dd3
dd3
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