2012-07-02 1 views
155

ファイルに特定の文字列が含まれているかどうか、bashにチェックしたいとします。このスクリプトを使用しましたが、機能しません:ファイルにbashを使用して特定の文字列が含まれているかどうかを確認する方法

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

私のコードには何が間違っていますか?

+2

http://stackoverflow.com/questions/4749330/how-to-test-if-string-exists-in-file-with-bash-shell – Pawel

答えて

299
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を返した場合、条件が真であることを意味します。そうでなければfalse。

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

ご覧のとおり、ここではプログラムを直接実行します。追加の[]または[[]]はありません。

+1

親愛なるイゴールに感謝、非常に良い答えと完全...私はこのポストから非常に勉強しました。 – Hakim

+0

'grep'とasnwerの利用可能なオプションの詳細については、http://stackoverflow.com/a/4749368/1702557 – Pawel

+1

を参照してください。' -Fxq'パラメータはhttp://stackoverflow.com/a/4749368/544721 –

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

あなたはタイプミスがありますか? $であるはずですか? – lzap

+0

... '$?'を意図しているだけでなく、全く必要はありません。もし 'grep -q ... if 'を実行すればいいでしょう。 –

+0

さらに' foo && truthy_action || falsey_action'は真の3項演算子ではありません。もし 'truthy_action'が失敗すると、' falsey_action'が_さらに_実行されます。 –

0

最短(正しい)バージョン:

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" 
+0

'if grep -q something file;エコー・イエス。そうでない場合はエコーしない。 fi'。 '$? 'をまったく混乱させる理由はありません。 –

0

これを実行しても問題なく動作しているようですあなたが望んで行う方法をあなたに言った他の回答に加えて、

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

、私はあなたが何を望むかである(間違っていたかを説明してみてください。

Bashでは、ifに続けてコマンドを実行します。このコマンドの終了コードが0の場合はthenの部分が実行され、実行されている場合はelseの部分が実行されます。

あなたは、任意のコマンドで他の回答で説明したようにそれを行うことができます。if /bin/true; then ...; fi

[[は、ファイルの存在、変数の比較のように、いくつかのテストに特化した内部bashのコマンドです。同様に[は、大体同じテストを実行するが、最後の引数として]が必要な外部コマンド(通常は/usr/bin/[にあります)です。そのため、]には、]]ではなく、左側のスペースが必要です。

ここでは、[[でも[も必要ありません。

もう1つのことは、あなたが物事を引用する方法です。 bashでは、引用符のペアがネストするケースは1つしかありません。それは"$(command "argument")"です。しかし'grep 'SomeString' $File'には'grep 'が引用された単位であるため、SomeStringと連結されてから' $File'に再度連結されるため、単語は1つのみです。変数$Fileは、一重引用符を使用するため、その値に置き換えられません。適切な方法はgrep 'SomeString' "$File"です。

7
##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 
+0

ディレクトリを変更することは、通常はお勧めできません(ここでは完全に不要です。ファイル名をターゲットディレクトリで修飾するだけです)。あなたが持っているものは、受け入れられた答えとまったく同じものです。 – Mat

+0

アドバイスありがとうMat –

1
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 
3
grep -q [PATTERN] [FILE] && echo $? 

パターンが見つかった場合に終了ステータスが0(TRUE)です。あなたは、文字列をcheckifしたい場合には

0

は、全体のラインと一致し、それが固定文字列であれば、あなたは男のファイルからそれを

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 

をこの方法を行うことができます。

-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.) 
0

これを試してみてください:

if [[ $(grep "SomeString" $File) ]] ; then 
    echo "Found" 
else 
    echo "Not Found" 
fi 
関連する問題