명령: ls /etc sort | grep d*는 결과를 생성하지 않지만 ls /etc sort |

명령: ls /etc sort | grep d*는 결과를 생성하지 않지만 ls /etc sort |

오늘 밤 나는 파이프와 grep을 가지고 놀고 있습니다. 나는 grep이 정규식을 사용한다는 것을 알고 있으며 *는 앞의 문자가 0번 이상 나타나는 것을 의미합니다. 따라서 다음 명령을 실행하면 전체 디렉터리가 나열되어야 하지만 아무 것도 나열되지 않는다는 것을 이해했습니다. 일어나는 일은 명령줄 재설정뿐입니다.

[root@LinuxAcademy etc]# ls /etc | sort | grep d*
[root@LinuxAcademy etc]#

그러나 명령을 다시 실행하고 d를 p로 바꾸면 예상대로 전체 디렉터리가 나열됩니다.

[root@LinuxAcademy ~]# ls /etc | sort | grep p*
ConsoleKit
DIR_COLORS
DIR_COLORS.256color
DIR_COLORS.lightbgcolor
NetworkManager
X11
...........<<rest of listing not pasted in>>

grep d* 에서는 오류가 발생하지 않았지만 확인을 위해 stderr을 파일로 리디렉션했지만 아무것도 인쇄되지 않았습니다.

그런 다음 grep이 "grep d*"의 "d"를 옵션이나 명령으로 해석할 수 있다고 생각했지만... 그것도 사실이 아닌 것 같습니다.

명령을 사용할 때 무슨 일이 일어나고 있고 왜 일어나는지 이해하도록 도와줄 수 있는 사람이 있나요?

grep d*

목록에 아무것도 없나요?

답변1

정규 표현식은 글로브가 아닙니다.

"d"로 시작하는 파일을 원할 것 같습니다. 이 경우 다음이 필요합니다.

ls /etc | sort | grep '^d'

뭔가 잘못됐어

다음 명령문의 작동 방식은 현재 디렉터리의 파일에 따라 다릅니다.

ls /etc | sort | grep p*

인용되지 않았기 때문에 쉘은 glob 확장을 시도하고 p*이를 임의의 파일 이름으로 대체합니다.현재 디렉토리에서성냥.

일치하는 파일 이름이 없으면 리터럴이 p*에 전달 됩니다 grep. 정규 표현식이 필요하므로 문자가 0개 이상 발생한다는 의미로 grep해석됩니다 . 모든 것은 존재 하거나 존재하지 않기 때문에 ,p*pp모든 것과 일치.

grep d*아무것도 나열되지 않습니까?

이는 아마도 d현재 디렉터리에 . 구체적으로 파일 이름이 이라고 가정해 보겠습니다 dichotomy. 셸은 이를 확장하여 d*dichotomy인수로 전달합니다 grep.

grep dichotomy

아마도 이것이 실행할 때 결과가 나오지 않는 이유일 것입니다 grep d*.

여러 파일이 하나의 glob과 일치하면 d*어떻게 되나요 ?

다음 명령을 고려하십시오.

grep d*

이 glob과 일치하는 파일이 여러 개인 경우 dmesg daemon.logsum 이라고 말합니다 dpkg.log. 쉘은 d*이러한 파일의 알파벳순 목록으로 확장됩니다(로케일에 따라 다름). 이로 인해 다음이 발생할 수 있습니다.

grep daemon.log dmesg dpkg.log

daemon.log이 명령은 dmesg문자열이 있는지 파일과 파일을 검색합니다 dpkg.log. 문자열이 이 파일에 나타나지 않으면 출력이 없습니다.

관련 정보