
이것은 내 테스트 파일 test.txt입니다.
hello
user1 ALL=(ALL) NOPASSWD: /usr/bin/* /app/tomcat/tomcat*/webapps/*, /usr/bin/rm -rf /app/tomcat/tomcat*/webapps/*,/bin/rm -rf /app/tomcat/tomcat*/webapps/**.sh , /bin/kill -3 *
다음 정규식을 사용하여 필요한 줄을 성공적으로 찾을 수 있었습니다.
grep -P '(^[^#;]ser1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt
user1
그러나 정규식 대신 전체 단어를 제공하면 ser1
일치하는 항목이 없습니다.
다음과 같은 이유로 정규식이 실패합니다.
grep -P '(^[^#;]user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt
user1
해당 줄과 일치하도록 정규식을 제공하고 싶습니다 .
뭔가 제안해주실 수 있나요?
답변1
문제는 두 가지를 명시적으로 달성하려고 하지만 두 가지가 서로를 암시한다는 것입니다.
- 이 줄은 다음으로 끝나야 합니다.
user1
- 줄은 주석 기호(
#
또는 )로;
시작 하면 안 됩니다.
#
그러나 두 번째 정규 표현식에서는 "행은 또는가 아닌 문자로 시작해야 하며 ;
다음을 포함해야 합니다 user1
. 따라서 grep
앞에 문자가 올 것으로 예상됩니다 user1
. 이는 "모든 문자"를 요청하는 첫 번째 정규 표현식에서는 문제가 되지 않습니다. #
or 이외 의 문자로 시작하는 것과 마찬가지로 or 이외의 문자 ;
뒤에 "가 옵니다 .ser1
user1
#
;
줄이 로 시작한다고 확신하는 경우 user1
간단히 다음을 사용할 수 있습니다.
grep -P '^user1 etc.'
혹은 자리가 있을 경우,
grep -P '^ *user1 etc.'
답변2
정규식을 줄 시작 부분에 고정합니다.
^[^#;]ser1
#
이는 "or 이외의 문자로 시작하고 ;
뒤에 문자열이 오는 일치 라인을 의미합니다 ser1
. 따라서 of 와 일치합니다 [^#;]
. 전체 단어를 제공하려면 다음으로 직접 시작하는 라인을 찾아야 합니다.u
user1
user1
^user1
또는 다음 패턴이 0회 발생하도록 허용합니다 [^#;]
.
^[^#;]*ser1
따라서 전체 명령은 다음과 같습니다.
grep -P '(^user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt
또는
grep -P '(^[^#;]*user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt
그러나 이는 매우 복잡해 보입니다. 정말로 필요한 것은 다음과 같습니다.
grep -P '^[^#;]*user1'
이 예에서는.