오늘 밤 나는 파이프와 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*
p
p
모든 것과 일치.
왜 grep d*
아무것도 나열되지 않습니까?
이는 아마도 d
현재 디렉터리에 . 구체적으로 파일 이름이 이라고 가정해 보겠습니다 dichotomy
. 셸은 이를 확장하여 d*
에 dichotomy
인수로 전달합니다 grep
.
grep dichotomy
아마도 이것이 실행할 때 결과가 나오지 않는 이유일 것입니다 grep d*
.
여러 파일이 하나의 glob과 일치하면 d*
어떻게 되나요 ?
다음 명령을 고려하십시오.
grep d*
이 glob과 일치하는 파일이 여러 개인 경우 dmesg
daemon.log
sum 이라고 말합니다 dpkg.log
. 쉘은 d*
이러한 파일의 알파벳순 목록으로 확장됩니다(로케일에 따라 다름). 이로 인해 다음이 발생할 수 있습니다.
grep daemon.log dmesg dpkg.log
daemon.log
이 명령은 dmesg
문자열이 있는지 파일과 파일을 검색합니다 dpkg.log
. 문자열이 이 파일에 나타나지 않으면 출력이 없습니다.