grep 명령에서 여러 *를 사용하는 데 문제가 있습니다.

grep 명령에서 여러 *를 사용하는 데 문제가 있습니다.

grep 명령에 두 개의 *를 사용하면 아무것도 반환되지 않는 이유를 아는 사람이 있습니까? 내 원래 명령은 다음과 같습니다.

find | grep 0000\:00\:*.0/usb1/authorized_default

이 예에서는 PCI 폴더 이름을 모르는 파일을 반환하려고 합니다. 이 명령은 예상대로(* 와일드카드) 완벽하게 작동하며 usb1이 "1a" 폴더에 있는지 확인합니다.

"usb1"을 "usb*"로 바꾸기 위해 명령에 또 다른 와일드카드를 넣은 경우 grep이 어떤 결과도 반환하지 않는 이유는 무엇입니까? 나의 궁극적인 목표는 모든authorized_default 파일을 반환하는 것입니다. 이는 다른 방법으로 더 효율적으로 수행할 수 있다는 것을 알고 있습니다. 내 질문은 이 작업을 수행하는 방법이 아니지만 방정식에 다른 "*" 기호를 넣을 때 grep이 결과를 반환하지 않는 이유는 무엇입니까?

find | grep 0000\:00\:*.0/usb*/authorized_default

귀하의 시간과 답변에 미리 감사드립니다.

답변1

grep사용일반적인 표현, 아니요쉘 볼.

정규식은 0000:00:*.0/usb1/authorized_default문자열 0000:00+ 0개 이상의 콜론 + 모든 문자 + 와 일치합니다 0/usb1/authorized_default.

*합계를 바꾸면 다음을 포함하는 .모든 문자열과 일치합니다 . ( 임의의 문자( ) 뒤에 임의의 숫자( )가 오는 것과 일치합니다.)0000:000/usb1/authorized_default.**.

마찬가지로 , etc. 와 usb*/일치 하지만 는 일치하지 않습니다 .us/usb/usbbb/usb1


실제로 *매개변수에서 인용되지 않은 부분이 grep전역 문자로 처리되는 문제도 있습니다.쉘을 통해, grep보기도 전에요. 따라서 glob 패턴으로 일치할 수 있는 파일이 있으면 0000\:00\:*.0/usb*/authorized_defaultgo 에 영향을 미칩니다 grep. 여러 일치 항목은 여러 인수로 간주되며 grep첫 번째 일치 이후의 인수는 파일 이름으로 간주됩니다.

이런 일이 발생하지 않도록 하려면 명령줄에서 정규식 앞뒤에 따옴표를 넣으세요.


어쨌든 grep@Kusalananda가 말했듯이 여기에는 필요조차 없습니다. 옵션을 사용하여 파일 이름을 전역 패턴과 일치시킬 -name수 있습니다 . find적어도 일부 구현에는 파일 이름을 정규식과 일치시키는 옵션 find도 있습니다 .-regex


정규식에는 다양한 변형이 있습니다. 다음을 참조하세요.내 정규 표현식이 X에서는 작동하지만 Y에서는 작동하지 않는 이유는 무엇입니까?

답변2

ilkkachu가 이미 지적했듯이 grep기본 정규식을 사용하면 이는 :*0개 이상 일치 :하고 b*0개 이상 일치함을 의미합니다 b.


grep를 출력하는 대신 를 find사용하여 find파일을 찾으세요. 일반적으로 파일 이름에는 개행 문자가 포함되어 있어 grep이 작동하지 않을 수 있습니다. 또한 보려는 경로 이름을 직접 필터링 하는 것이 find더 효율적이고 안전합니다 .

find . -type f -name 'authorized_default'

경로 이름의 다른 부분을 일치시켜야 하는 경우:

find . -type f -path '*0000:00:*.0/usb*/authorized_default'

-path파일 이름 와일드카드 패턴 처럼 작동 -name하지만 경로 이름의 파일 이름 부분만이 아니라 전체 경로와 일치합니다( a 는 *하나 이상과 일치할 수 있음 /).

관련된:

관련 정보