Bashを使用してファイルに特定の文字列が含まれているかどうかを確認する方法


266

ファイルに特定の文字列が含まれているか、bashに含まれていないかを確認したい。このスクリプトを使用しましたが、機能しません。

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

私のコードの何が問題になっていますか?



ここでの出力をgrepしてみましょうcommandstackoverflow.com/questions/12375722/...
rogerdpack

回答:


466
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
$

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



2
stackoverflow.com/a/4749368/544721の-Fxqようにパラメータを検討したい場合があります
Grzegorz Wierzowiecki

3
-m 1スキャンのパフォーマンスを向上させるために使用することを検討してください。最初の出現時に戻ります。
AlikElzin-kilaka 2017年

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/[ほぼ同じテストを実行します]が、最終引数として必要な外部コマンド(通常はにあります)です。]そのため、の場合とは異なり、左側にスペースを埋める必要があります]]

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

もう1つは、引用する方法です。bashでは、引用符のペアがネストするケースは1つだけです"$(command "argument")"。しかし、'grep 'SomeString' $File'では、単語が1つしかありません'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
通常、ディレクトリの変更はお勧めできません(ここでは完全に不要です。ファイル名をターゲットディレクトリで修飾するだけです)。そして、あなたが持っているものは、受け入れられた答えとまったく同じですが、詳細はほとんどありません。
マット

アドバイスをありがとうマット
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。いじる理由$?はまったくありません。
Charles Duffy 2013年

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非常に正当な理由で終了ステータスを返します。出力を文字列にキャプチャすると、空ではないと言えるように、大量のテキストがバッファに格納される可能性があります。
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実行さます。
Charles Duffy

より一般的には、の目的if、コマンドを実行してその終了コードを確認することです。まれに$?明示的に調べる必要はほとんどありません。
tripleee
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.