2つのクエリをgrep

2つのクエリをgrep

以下を使用して、複数のファイルから2つの特定の単語を含む行を検索できます。

for f in $(ls *.txt); do
  echo ">"$f; more $f | grep word1 | grep word2
done

これで、内容全体を繰り返し入力する必要がないように、これを行うシェルスクリプトを作成したいと思います。検索時に1、2単語を使用するオプションも追加したいと思います。検索された単語をコマンドラインのシェルスクリプトに渡します。私は次のシェルスクリプトsearchwords.shを書きました。

word1=$1
word2=$2
for f in $(ls *.txt); do
echo ">"$f
###if word2 is empty; then execute 
if [-z $word2]; then
        more $f | grep $word1
else
###if word2 is not empty
        more $f | grep $word1 | grep $word2
fi
done

使用法:

sh searchwords.sh word1 word2

目的の結果が得られましたが、エラー出力も表示されます。

[-z: not found

私のコードが正しくないことを知っていますが、配置できません。

答え1

スクリプトにいくつかのエラーがあります。

  • 足りないスペース[-z $word2]
  • 変数に二重引用符がありません。
  • 役に立たない使用more | grep
  • 解析された出力がls破損しています。
  • grep$word1$word2ダッシュで開始または起動すると失敗します。-

修正内容は次のとおりです。

word1=$1
word2=$2

for f in ./*.txt; do
  printf '>%s\n' "$f"

  ###if word2 is empty; then execute 
  if [ -z "$word2" ]; then
    grep -- "$word1" "$f"
  else
  ###if word2 is not empty
    grep -- "$word1" "$f" | grep -- "$word2"
  fi
done

関連情報