검색 스크립트를 작성했습니다..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
이렇게 하면 모든 명령의 오류가 리디렉션됩니다(모든시험-그리고결과--) 블록 내.