ファイルに特定の文字列が含まれているかどうか、bashにチェックしたいとします。このスクリプトを使用しましたが、機能しません:ファイルにbashを使用して特定の文字列が含まれているかどうかを確認する方法
if [[ 'grep 'SomeString' $File' ]];then
Some Actions
fi
私のコードには何が間違っていますか?
ファイルに特定の文字列が含まれているかどうか、bashにチェックしたいとします。このスクリプトを使用しましたが、機能しません:ファイルにbashを使用して特定の文字列が含まれているかどうかを確認する方法
if [[ 'grep 'SomeString' $File' ]];then
Some Actions
fi
私のコードには何が間違っていますか?
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
$
ご覧のとおり、ここではプログラムを直接実行します。追加の[]
または[[]]
はありません。
grep -q "something" file
[[ !? -eq 0 ]] && echo "yes" || echo "no"
あなたはタイプミスがありますか? $であるはずですか? – lzap
... '$?'を意図しているだけでなく、全く必要はありません。もし 'grep -q ... if 'を実行すればいいでしょう。 –
さらに' foo && truthy_action || falsey_action'は真の3項演算子ではありません。もし 'truthy_action'が失敗すると、' falsey_action'が_さらに_実行されます。 –
最短(正しい)バージョン:
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"
'if grep -q something file;エコー・イエス。そうでない場合はエコーしない。 fi'。 '$? 'をまったく混乱させる理由はありません。 –
これを実行しても問題なく動作しているようですあなたが望んで行う方法をあなたに言った他の回答に加えて、
if grep $SearchTerm $FileToSearch; then
echo "$SearchTerm found OK"
else
echo "$SearchTerm not found"
fi
、私はあなたが何を望むかである(間違っていたかを説明してみてください。
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"
です。
##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
ディレクトリを変更することは、通常はお勧めできません(ここでは完全に不要です。ファイル名をターゲットディレクトリで修飾するだけです)。あなたが持っているものは、受け入れられた答えとまったく同じものです。 – Mat
アドバイスありがとうMat –
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
grep -q [PATTERN] [FILE] && echo $?
パターンが見つかった場合に終了ステータスが0(TRUE)です。あなたは、文字列をcheckifしたい場合には
は、全体のラインと一致し、それが固定文字列であれば、あなたは男のファイルからそれを
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.)
これを試してみてください:
if [[ $(grep "SomeString" $File) ]] ; then
echo "Found"
else
echo "Not Found"
fi
http://stackoverflow.com/questions/4749330/how-to-test-if-string-exists-in-file-with-bash-shell – Pawel