2011-10-19 2 views
1

x 일보다 오래된 apache 로그 파일을 저장 위치로 옮기는 짧은 스크립트가 있습니다. 정규 표현식은 mod_jk 디렉토리에있는 jk.shm.some_number 파일 이름을 캡쳐하고 있는데 이것은 원하지 않는 동작입니다 (mtime 플래그를 사용하여 며칠 동안 쿠션을 사용하면 현재 활성 파일이 우발적으로 배치되는 것을 피할 수 있습니다.) 아마도 그 이유는 나는이 문제가 지금까지 나타나지 않는 것을 보았다). 전체 정규식은 : '[error,access,error_log,access_log,mod_jk.log]*.[0-9]*' 나는 그저 바보 같은 운명으로 인해 일하고 있다고 생각합니다. 나 또한 mod_jk 부분을 자체적으로 실행하기 위해 'mod_jk.log.[0-9]*'을 실행하려고 시도했으며 예상대로 작동합니다 (앞이나 뒤에 없음). 대괄호 안에 포함 시키면 jk.shm.some_number 파일이 나타납니다. 대괄호 안에있는 문자 범위와 일치하므로 추측합니다. RegexBuddy를 사용하여이 작업을하려하지만, 현명한 사람들 중 한 명이 내 실수를 지적하고 올바른 길로 나를 도울 수있을 것이라고 생각했습니다. .정규 표현식의 일부가 아닌 bash 쉘 명령의 Regex가 단독으로 작동합니다.

find -name '[error,access,error_log,access_log,mod_jk.log]*.[0-9]*' -type f 
+0

가장 일치하는 줄을 제공하십시오. –

+0

error.11111111111, access.11111111, error_log.1111111111, access_log.1111111, mod_jk.log.111111111 기본적으로 아파치 로그 파일의 디렉토리와 하위 디렉토리에있는 로그 파일의 파일 이름은 위에서 설명한 것입니다. –

+1

내 생각 엔 정규식을 사용하지 않고 glob 패턴을 사용하고있는 것 같습니다. 'mv {access, error, access_log, error_log, mod_jk.log}. [0-9] * dir'와 같은 것을 시도하는 경우 정규식이 아닌 확장 된 glob 패턴이고 중괄호 여야합니다. – tripleee

답변

0

경우옵션을 사용하면됩니다. 그렇지 않으면 이것을 개별 glob 패턴으로 분할해야합니다. 글로브 패턴에 * 그냥 DOS 스타일의 와일드 카드가 아닌 정규식 반복 연산자이다

find -type f -name 'error.[0-9]*' -o -name 'access.[0-9]*' -o -name 'error_log.[0-9]*' -o -name 'access_log.[0-9]*' -o -name 'mod_jk.log.[0-9]*' 

참고. find -regex 인 경우 일치하는 항목을 더 많이 제어 할 수 있습니다.두 정규식

find -type f -regex '.*\(\(error\|access\)\(_log\)?\|mod_jk\.log\)\.[0-9]+' 

[ab|cd] glob에은 대괄호 안에 열거 세트 중 하나의 문자와 일치; 파이프 문자는이 문맥에서 그 자체를 나타냅니다.

+0

도움을 주셔서 감사합니다. –

0

*에 일치하는 0 개 이상의 문자 그래서 정말이 정규식은 어떤 * * 파일 이름과 일치합니다 :

이는 -mtime 플래그 '작품'을 제거하는 현재의 행입니다. *+으로 변경하려고합니다. 이는 이전 표현식과 적어도 하나의 일치를 강제합니다.

+0

이 경우 [elements] *는 대괄호 안에있는 요소 중 하나와 일치해야하며 와일드 카드로 작동하지 않아야한다고 생각했습니다. [0-9] *는 파일 확장자 구분 기호 '.'다음의 숫자와 일치해야합니다. 내가 +를 사용하면 아무것도 일치하지 않습니다. –

0

난 당신이

(error|access|error_log|access_log|mod_jk.log).[0-9]+ 

귀하의 정규식 첫 번째 대괄호 문자 만 포함하는 모든 이름을 일치 도트 후 ","어쩌면 어떤 자리, 표준 생각합니다. 오직 점만으로도 괜찮 았을 것입니다.

대체품을 원하면 파이프가있는 원형 브래킷을 배출기로 사용하십시오. 당신은 점 뒤에 얼마나 많은 자릿수가 있는지 알고 있습니까?

+0

저에게 그것은 잘 작동합니다 :'TEST = access_log.1111111; EXPR = "(오류 | 액세스 | error_log | access_log | mod_jk.log). [0-9] +"; [$ TEST = ~ $ EXPR]; echo $?'- 어떻게 정규식을 실행하나요? 이 표현식은 "확장 된"표기법을 사용한다고 생각합니다. grep은 잘못된 것이 아니라면 추가 플래그가 필요합니다. –

+0

find의 일부로 사용하고 있습니다 : find -name 'regex_here'-type f -mtime ... 각 확장의 정확한 길이를 모르지만 [0-9] *가 작동하는 것 같습니다. 지금은 검색의 해당 부분까지갑니다. –

0

당신의 패턴 :

'[error,access,error_log,access_log,mod_jk.log]*.[0-9]*' 

당신이 생각하는 일을하지 않습니다. regexp 일지라도 결함은 있지만 bash는 globbing을 사용합니다. []]는 종류의 한 문자와 일치하지만 시도하는 것처럼 완전한 단어는 아닙니다. *은 일치하지 않는 문자와 일치하지만 0에서 9 사이의 문자는 순서와 일치하지 않습니다. .

첫째로 globbing을 확장 된 사용 : 다음

shopt -s extglob 

사용 :

+(pattern1|pattern2|..) for alternate patterns. 

+([0-9]|[0-9][0-9]|..) 

HTH 크리스에게 find가을 가지고

+0

답변을 주셔서 감사합니다. 제게 올바른 길을 걸어주었습니다. 문제는 find를 사용하고 -regex 옵션을 사용하지 않는 것이 었습니다. 도움에 감사드립니다. –