ファイルが存在しない場合でもgrep操作を実行する方法は?

ファイルが存在しない場合でもgrep操作を実行する方法は?

私のコードでこのようなことをしました。

file_nm=`ls -latr *abc*`
if [ `grep "search_txt" "$file_nm" | wc -l` -gt 0 ]
then
  echo "string found"
else
  echo "string not found"
fi

file_nm空白であると、私のコードがgrep予想されるので中断されますfile_nm。このコードをどのように機能させることができますか?grepファイルが存在しない場合にコマンドをバイパスするオプションはありますか?

答え1

努力する:

grep "search_txt" /dev/null "$file_nm"

/dev/null処理できるファイルは常に1つ以上あるため、フィードを使用すると存在しなくても機能します。grep$file_nmgrep/dev/null

答え2

これを大幅に簡素化できます。迷惑な質問以下を実行して、ls(固有)を解析します。

file_nm=$(find . -maxdepth 1 -name "*abc*");
[ -e "$file_nm" ] && grep -q "search_txt" "$file_nm" &&
      echo "string found" ||
      echo "string not found"

ただし、元の例のように複数の一致するファイルがある場合は、*abc*次のようにします。

for i in *abc*; do 
    grep -q "search_txt" "$i" && 
        echo "string found in $i" || 
        echo "string not found in $i"
done 

複数のファイルの一致に気にせず、一致するファイルの中に*abc*文字列が含まれているかどうかを知りたい場合は、search_txt次のようにします。

grep -q "search_txt" *abc* &&  echo "string found" || echo "string not found"

答え3

次のようないくつかの問題があります。

  • 公開したコードは中断されません。
  • などの名前のファイルを探すという意味の-lフラグを使用します。ls-rw-r--r--
  • ls出力を完全に解析することは避けるべきです。

そしてテスト出力は不要で、grep終了状態のみを使用できます。からman grep

 EXIT STATUS
       The exit status is 0 if selected lines are found, and 1 if not found.

同じことを行う単純化されたバージョンは次のとおりです。

if grep -q "search_txt" *abc*
then
  echo "string found"
else
  echo "string not found"
fi

答え4

あなたはする必要があります$file_nm空のテストgrepを実行する前に

if [ -n "$file_nn" ];

$ file_nmが空でない場合はTrueを返します。

関連情報