2012-02-16 2 views
3

BASH 스크립트를 사용하여 변경 사항을 모니터링하고있는 간단한 텍스트 파일이 있습니다. 찾고있는 텍스트는 줄의 시작 부분에서 시작하거나 공백으로 시작할 수 있습니다. 내 검색은 매우 간단합니다.GREP : 대화 형 대 crontab

#!/bin/bash 
value=`/bin/grep "^\s*mystring:" mytextfile` 
echo "found: [$value]" >> myoutput.log 

이 명령 줄에서 실행할 때 잘 작동하지만 crontab을 구성 스크립트에서 호출하면 작동하지 않습니다. 내 문제에 대한 해결 방법이 있지만 여전히 crontab 내에서 grep을 호출 할 때 캐럿 (^) 문자와 공백 (\ s *) 문자를 함께 사용하는 이유를 설명 할 수 없습니까?

변경 사항 PATH 및 환경이 아무런 영향을 미치지 않는 것 같습니다. 어떤 아이디어?

... 의견 주셔서 감사합니다! crontab을 구성되었을 그렙에

  1. 경로

해결 구문을 사용 하였다

  • 동일한 스크립트 커맨드 라인에서 호출 된 일치 하였다;

    value=`/bin/grep -E '^[[:space:]]*mystring:' myfile` 
    

    3 가지의 조합이 필요합니다.

    1. 작은 따옴표를 정규식
    2. 그렙 -E를 사용하여 확장 된 정규 표현식
    3. [[: 공간 :]]! 대신 \ S 공백 문자의

    난 아직 확실하지 않다 왜 [: space :]]가 대화식으로 작동 할 때 \ s가 crontab에 없을 때 작동합니다.

  • +0

    어떻게 실패합니까? 결과물로 뭐하고 있니? 완전한 구성 (crontab + 스크립트)을 보여줄 수 있으며 우리가하려는 일을 알려주십시오. – larsks

    +1

    '\ s'을 사용하면 안됩니다. '/ :/grep -E '^ [[: space :]] * mystring'mytextfile' – Sorpigal

    +0

    당신은'/ bin/grep'을 사용하고 있습니까? 두 곳에서? 대부분의 경우 쉘 스크립트에서 grep의 최신 버전을 사용하고 있으며 기본적으로 regex를 지원합니다. – anubhava

    답변

    0

    명령 줄에서 쉘 스크립트 내부에서 이러한 명령을 실행할 수 있지만 작동하지만 crontab에서는 작동하지 않으면 내 생각에 crontab의 기본 SHELL 변수가 동일한 쉘로 설정되어 있지 않습니다 명령 줄에서 사용합니다. 이것이 사실일까요?

    같은 방법으로 당신은 등/crontab을 /에서 기본값을 확인하실 수 있습니다, 또는 (일정 이상)은 crontab 자체를 강제 할 수

    SHELL =/빈/bash는

    광산이 설정을 이 같은 그대로/빈/bash는에, 나는 당신의 스크립트를 사용 할 수 있었다 : 그것은 라인과

  • 작성/tmp를/mytextfile "mystring에 당신의 코드

    • 만든 /tmp/test.sh : "그 안에, 더 많은 임의의 테스트 라인이 뒤 따른다. .
    • 내 crontab에 다음 항목을 만들었습니다. */1 * * * * (cd /tmp; /bin/bash test.sh)
    • myoutput.log 파일을 꼬박 1 분 동안 기다렸습니다.

    라인 found: [ mystring:]이 1 분마다 나타납니다. 그래서 효과가있었습니다.

    저는 CentOS 6를 실행 중입니다.내가 정규식에 대한 GREP을 사용하는 경우 2

  • +0

    흠, 나를 위해 작동하지 않습니다. CentOS 5.6 (최종)을 사용하고 있습니다. 쉘을 가지고 있습니다./crontab에/bin/bash를 사용하고 있습니다. */1 * * * * 루트 (cd/tmp;/bin/bash /tmp/test.sh) – pedwards

    0

    보통, 나는 같은 일을 "egrep을"을 정규 표현식을 처리하거나 실행 지시하는 플래그를 포함 할 수 있는지 확인하려고합니다. 조금 늦게 파티에 ... 난 그냥 완벽 매우 동일한 스크립트를 사용의 년 후에 egrep와 매우 비슷한 문제를 발견하는 경우

    +0

    답을 이해하지 못합니다. AFAIK,'grep'은 항상 정규 표현식을 찾습니다. 그 이름은'g/re/p'의 수축이며,'re'와 print '를 세계적으로 검색하는'ed' 명령입니다. 유일한 문제는'-E' (확장 정규 표현식) 또는'-F' (고정 문자열) 플래그로 제어하는 ​​정규 표현식의 어떤 방언 (또는 기본 정규 표현식에 대해서도)입니다. 하지만 그들은 모두 정규 표현식입니다. ('grep'의 일부 버전은 PCRE - Perl 호환 정규 표현식도 지원합니다.) –

    +0

    정규 표현식에 대한 다른 종류의 (표준) 글쎄, 당신이 고수하고자하는 것을 grep에게 알려줄 수 있습니다. 그래서 그게 제가 얻었던 것입니다. –

    0

    죄송합니다.

    환경 변수가 LANG 인 것으로 나타났습니다. 예를 들어 'blablabla'에 대한 egrep이라면 콘솔과 crontab에서 잘 작동합니다. 그러나 'blablablá'를 검색하면 후자에서는 실패하지만 이전에서는 실패합니다 (전 Latin1 인코딩을 사용합니다).

    printenv은 crontab에서 LANG=en_US.UTF-8을 주었고, 콘솔에는 LANG 환경 변수가 없습니다. 따라서 해결책은 내 crontab 파일에 LANG=""을 추가하는 것이 었습니다. 문제 해결됨.

    갑자기 변경된 이유가 없습니다. crontab 또는 grep의 업데이트 일 수 있습니까?

    그래서 나는 env 변수 문제를 살펴볼 것입니다. 다른 사람들은 다른 변수와 함께 이것을 제안했습니다.