리디렉션 명령

리디렉션 명령

검색 스크립트를 작성했습니다..ini특정 단어를 제출하세요.

이것.ini파일의 이름은 두 가지 중 하나입니다(가정).구성 파일또는구성 파일)이므로 둘 다 확인해야 합니다.

if나는 다음 문장을 처리하기 위해 논리를 사용합니다 OR.

HAS_SOME_WORD=FALSE
if    [ "$(grep -v '^;\|^\[' "path_to_file/config.ini" | \
           grep -c '\\some_word')" -ge 1 ] \
   || [ "$(grep -v '^;\|^\[' "path_to_file/configuration.ini" | \          
          grep -c '\\some_word')" -ge 1 ]; then 
    HAS_SOME_WORD=TRUE
else
    HAS_SOME_WORD=FALSE
fi

나는 다음으로 시작하는 줄을 피하고 있습니다.";"또는"["단어를 찾을 때 원하는 검색에 해당 단어가 포함되어서는 안 되기 때문입니다."\어떤 단어들".

내가 원하는 것은 두 파일 중 하나가 존재하지 않을 때 grep 오류 메시지를 제외하는 것입니다. 즉:

grep: path_to_file/config.ini: No such file or directory

또는:

grep: path_to_file/configuration.ini: No such file or directory

/dev/null스크립트를 실행할 때 출력을 리디렉션하여 이를 방지 할 수 있었습니다 .

./search_script.sh 2>/dev/null

if그러나 스크립트가 호출될 때가 아니라 코드 자체에 이 리디렉션을 포함하고 싶습니다 .

이것을 어떻게 구현합니까? 내가하려는 일을 달성하는 더 효율적인 방법이 있습니까?

-q오류 메시지 인쇄를 피하기 위해 매개변수를 추가해 보았 grep으나 소용이 없었습니다. 또한 2>/dev/null각 문장 끝에 리디렉션을 추가해 보았지만 if올바른 구문을 적용하지 않은 것 같습니다.

답변1

grep여러 파일을 검색할 수 있고 코드를 단순화 -v할 수 있으므로 다음 을 시도해 보세요.-c

cd "path_to file"
if grep -qs '^[^;[].*\\some_word' config.ini configuration.ini ; then 
    # ...etc
fi
cd -

grep긴 형식 옵션:

grep --quiet --no-messages '^[^;[].*\\some_word' \
     config.ini configuration.ini 

OP 코드 -v(또는 --invert-match)와 두 번째 코드는 정규식과 같은 작업을 한 번에 수행할 수 있으므로 grep필요하지 않습니다 . ^[^;[]에서 man grep:

대괄호 표현식은 다음으로 묶인 문자 목록입니다.[그리고]. 목록의 첫 번째 문자가 캐럿인 경우 목록의 모든 단일 문자와 일치합니다.^그런 다음 모든 문자와 일치합니다.아니요목록에 있습니다.

답변2

이것기타 답변, 제안 --no-messages/ -s,귀하의 질문에 더 구체적이지만 다음은 "자동"옵션이 없는 명령에도 적용됩니다.

리디렉션 명령

리디렉션 오류간단한 명령, 리디렉션을 위해 이 명령을 사용해야 합니다. 파이프라인의 동일한 위치에서:

if [ "$(grep -v '^;\|^\[' "path_to_file/config.ini" 2>/dev/null | \
  grep -c '\\some_word')" -ge 1 ] \

첫 번째 grep는 "해당 파일이나 디렉터리가 없습니다"라는 메시지를 생성하는 것이므로 리디렉션해야 하는 메시지입니다.

파이프라인 리디렉션

파이프라인의 여러 부분에서 오류가 발생할 가능성이 있는 경우 전체 파이프라인을 한 곳에 배치할 수 있습니다.그룹, 리디렉션이 이어집니다.

if [ "$( ( grep -v '^;\|^\[' "path_to_file/config.ini" | \
  grep -v -f "path_to_file/ignored_patterns" | \
  grep -c '\\some_word' )  2>/dev/null )" -ge 1 ] \

조건부 구성 리디렉션

전체를 리디렉션할 수 있습니다.if 구조끝 뒤에 리디렉션을 배치하면 다음과 같습니다 fi.

if [ "$(grep -v '^;\|^\[' "path_to_file/config.ini" | \
    grep -c '\\some_word')" -ge 1 ] \
 ...
else
 ...
fi 2>/dev/null

이렇게 하면 모든 명령의 오류가 리디렉션됩니다(모든시험-그리고결과--) 블록 내.

관련 정보