Bash를 사용하여 파일에 특정 문자열이 포함되어 있는지 확인하는 방법


265

파일에 bash에 특정 문자열이 포함되어 있는지 확인하고 싶습니다. 이 스크립트를 사용했지만 작동하지 않습니다.

 if [[ 'grep 'SomeString' $File' ]];then
   # Some Actions
 fi

내 코드에 어떤 문제가 있습니까?



여기의 출력 grep을하는 방법 command: stackoverflow.com/questions/12375722/...
rogerdpack

답변:


465
if grep -q SomeString "$File"; then
  Some Actions # SomeString was found
fi

당신은 [[ ]]여기에 필요하지 않습니다 . 명령을 직접 실행하십시오. -q문자열을 찾을 때 표시 될 필요가없는 경우 옵션을 추가하십시오 .

grep명령은 검색 결과에 따라 종료 코드 0 또는 1을 반환합니다. 무언가가 발견되면 0; 그렇지 않으면 1입니다.

$ echo hello | grep hi ; echo $?
1
$ echo hello | grep he ; echo $?
hello
0
$ echo hello | grep -q he ; echo $?
0

의 조건으로 명령을 지정할 수 있습니다 if. 명령이 종료 코드에서 0을 리턴하면 조건이 true임을 의미합니다. 그렇지 않으면 거짓.

$ if /bin/true; then echo that is true; fi
that is true
$ if /bin/false; then echo that is true; fi
$

보시다시피 여기에서 프로그램을 직접 실행하십시오. 추가 []또는 없음 [[]].



2
stackoverflow.com/a/4749368/544721-Fxq 에서와 같은 매개 변수 를 고려할 수도 있습니다
Grzegorz Wierzowiecki

3
-m 1스캔 성능을 향상 시키려면 사용 을 고려하십시오 . 처음 발생했을 때 반환합니다.
AlikElzin-kilaka 2012 년

1
SomeString정규 표현식 특수 문자 가 포함 된 경우 (예 :) .예기치 않은 결과가 발생할 수 있습니다. 항상 fgrep(또는 grep -F)를 사용하는 것이 더 안전합니다 ( 정말로 정규 표현식이 필요한 경우가 egrep아니면 (또는 grep -E)가 최선의 선택 일 것입니다)
Walter Tross

예제 if코드는 종료 코드가 0이 아닌지 확인하기 때문에 올바르지 않습니다. 파일을 읽을 수없는 것처럼 오류가 발생하면 종료 코드도 0이 아닙니다. 따라서와 같은 작업을 수행하고 (발견 된) ec=$?확인하고 0(발견 1되지 않은) 확인하고 다른 것이 있는지 (실패) 확인하십시오.
ddekany

40

원하는 것을 수행하는 방법을 알려주는 다른 답변 외에도 잘못된 것이 무엇인지 설명하려고합니다.

Bash에서 if명령을 따릅니다. 이 명령의 종료 코드가 0이면 then부품이 실행되고 그렇지 않으면else 부품이 실행됩니다.

다른 답변에서 설명한대로 모든 명령 으로이 작업을 수행 할 수 있습니다. if /bin/true; then ...; fi

[[파일 존재, 변수 비교와 같은 일부 테스트 전용 내부 bash 명령입니다. 마찬가지로 거의 동일한 테스트를 수행하지만 최종 인수로 필요한 [외부 명령 (일반적으로에 위치 함 /usr/bin/[)이 왼쪽에 공백으로 채워져 있어야합니다.]]]] .

여기 필요 [[도 없습니다[ .

또 다른 것은 물건을 인용하는 방법입니다. bash에는 따옴표 쌍이 중첩되는 경우가 하나뿐입니다 "$(command "argument")". 그러나 인용 된 단위 'grep 'SomeString' $File'이기 때문에 하나의 단어 만 있습니다.이 'grep '단위는에 연결 SomeString되고 다시 연결됩니다 ' $File'. $File작은 따옴표를 사용하기 때문에 변수 는 값으로 대체되지 않습니다. 올바른 방법은 grep 'SomeString' "$File"입니다.


15

파일 에 특정 문자열이 포함되어 있지 않은지 확인하려면 다음과 같이하십시오.

if ! grep -q SomeString "$File"; then
  Some Actions # SomeString was not found
fi

10
##To check for a particular  string in a file

cd PATH_TO_YOUR_DIRECTORY #Changing directory to your working directory
File=YOUR_FILENAME  
if grep -q STRING_YOU_ARE_CHECKING_FOR "$File"; ##note the space after the string you are searching for
then
echo "Hooray!!It's available"
else
echo "Oops!!Not available"
fi

2
디렉토리 변경은 일반적으로 좋은 생각이 아니며 여기서는 완전히 불필요합니다. 파일 이름을 대상 디렉토리로 한정하십시오. 그리고 당신이 가진 것은 수락 된 답변과 정확히 똑같은 것이지, 세부 사항은 적습니다.
Mat

조언을 주셔서 감사합니다 Mat
Nevin Raj Victor

7

가장 짧은 (올바른) 버전 :

grep -q "something" file; [ $? -eq 0 ] && echo "yes" || echo "no"

로 쓸 수도 있습니다

grep -q "something" file; test $? -eq 0 && echo "yes" || echo "no"

그러나이 경우 명시 적으로 테스트 할 필요가 없으므로 다음과 동일합니다.

grep -q "something" file && echo "yes" || echo "no"

3
if grep -q something file; then echo yes; else echo no; fi. 전혀 혼란스러워 할 이유가 없습니다 $?.
찰스 더피

6

문자열이 전체 줄과 일치하는지 확인하고 고정 문자열 인 경우 다음과 같이 할 수 있습니다

grep -Fxq [String] [filePath]

 searchString="Hello World"
 file="./test.log"
 if grep -Fxq "$searchString" $file
    then
            echo "String found in $file"
    else
            echo "String not found in $file"
 fi

man 파일에서 :

-F, --fixed-strings

          Interpret  PATTERN  as  a  list of fixed strings, separated by newlines, any of 

which is to be matched.
          (-F is specified by POSIX.)
-x, --line-regexp
          Select only those matches that exactly match the whole line.  (-x is specified by 

POSIX.)
-q, --quiet, --silent
          Quiet; do not write anything to standard output.  Exit immediately with zero 

status  if  any  match  is
          found,  even  if  an error was detected.  Also see the -s or --no-messages 

option.  (-q is specified by
          POSIX.)

6
grep -q [PATTERN] [FILE] && echo $?

0패턴이 발견되면 종료 상태는 (true)입니다. 그렇지 않으면 공백입니다.


4
if grep -q [string] [filename]
then
    [whatever action]
fi

if grep -q 'my cat is in a tree' /tmp/cat.txt
then
    mkdir cat
fi

2

이 시도:

if [[ $(grep "SomeString" $File) ]] ; then
   echo "Found"
else
   echo "Not Found"
fi

3
나는 이것을 하향 조정하는 것을 망설이지 않고 있지만, 스택 오버플로는 이러한 종류의 프레첼 로직을 영속해서는 안됩니다. grep아주 좋은 이유로 종료 상태를 반환합니다. 출력을 문자열로 캡처하면 잠재적으로 많은 양의 텍스트가 버퍼에 저장되므로 비어 있지 않다고 말할 수 있습니다.
트리플 리

-1

나는 이것을했다, 잘 작동하는 것 같다

if grep $SearchTerm $FileToSearch; then
   echo "$SearchTerm found OK"
else
   echo "$SearchTerm not found"
fi

따옴표가 깨져서 출력을 보지 않기를 원할 것입니다 grep.
tripleee

-3
grep -q "something" file
[[ !? -eq 0 ]] && echo "yes" || echo "no"

1
오타가 있습니다-!? $로되어 있습니까?
lzap

... 그것의 의도 $?뿐만 아니라 전혀 필요하지 않습니다. 당신은 할 수 있습니다if grep -q ...
Charles Duffy

1
또한 foo && truthy_action || falsey_action실제 삼항 연산자가 아닙니다. truthy_action실패하면 추가로falsey_action 실행 됩니다 .
찰스 더피

보다 일반적으로, 목적if명령을 실행하고 종료 코드를 확인하는 것입니다. $?명시 적으로 검사 할 필요는 거의 없습니다 .
tripleee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.