grep“+”연산자가 작동하지 않습니다 ‘{print $9}’ | grep “^[a-z]*\.log.” 이것을

ls -l /var/log | awk '{print $9}' | grep "^[a-z]*\.log."

이것을 출력합니다 :

alternatives.log.1
alternatives.log.10.gz
alternatives.log.2.gz
alternatives.log.3.gz
alternatives.log.4.gz
alternatives.log.5.gz
alternatives.log.6.gz
alternatives.log.7.gz
alternatives.log.8.gz
alternatives.log.9.gz
apport.log.1
apport.log.2.gz
apport.log.3.gz

하지만 이것은:

ls -l /var/log | awk '{print $9}' | grep "^[a-z]+\.log."

아무것도 출력하지 않습니다.

왜? 방금 변경 *했습니다 +. 비슷하지 않습니까? 연산자 +는 하나 이상의 일치와 *0 이상이 필요합니다.



답변

이는 grep인수없이) 표준 정규식에서만 작동 하기 때문 입니다. +그래서를 사용하여, 당신은 사용해야하는 확장 된 정규 표현식의 일부 grep -E또는 egrep:

ls -l /var/log | awk '{print $9}' | grep -E "^[a-z]+\.log."

또한 확장 정규 표현식을 사용하지 않으려면이 작업을 수행 할 수 있습니다.

ls -l /var/log | awk '{print $9}' | grep "^[a-z][a-z]*\.log."


답변

MiJyns 답변을 자세히 설명하기 위해 +와 같은 “특수 문자”는 표준 정규식에서도 작동하지만 백 슬래시로 이스케이프 처리해야합니다. 기본 기대치가 표준 정규 표현식과 확장 정규 표현식 사이에서 뒤바뀐다고 말할 수 있습니다.

표준 정규식에서 문자는 기본적으로 문자 그대로 일치합니다. 예를 들어 grep "ab+"+에서 리터럴은 +입니다. 정규식은 예를 들어 “ab + ab”를 찾지 만 “abbbb”는 찾지 않습니다. +의 “특별한 의미”를 사용하려면 이스케이프해야합니다. 따라서 grep "ab\+"“abbb”는 찾을 수 있지만 “ab + ab”는 더 이상 찾을 수 없습니다. 마지막 예에서 +는 수량 자 “한 개 또는 여러 개”(이 경우 “하나 또는 많은 b”)로 해석되기 때문입니다.

확장 정규 표현식에서는 정확히 다른 방법입니다. 여기서 문자 그대로 처리하려면 “특수 문자”를 이스케이프해야합니다. 따라서 grep -E "ab+"“ab + ab”이 아닌 “abbb”를 찾습니다. +를 이스케이프하면 문자 그대로 일치합니다. 따라서 grep -E "ab\+"“abbb”가 아닌 “ab + ab”를 찾습니다.


답변