web-dev-qa-db-ja.com

grepはtrue / falseを返すことができますか、代わりの方法はありますか

このスクリプトの一部として、指定された最初の引数がファイルの最初のワードと一致するかどうかを確認できるようにする必要があります。存在する場合は、エラーメッセージで終了します。そうでない場合は、引数をファイルに追加します。 ifステートメントの記述方法は理解していますが、grepをスクリプト内で使用する方法はわかりません。 grepが次のようになることを理解しています

grep ^$1 schemas.txt

これは私が作るよりずっと簡単なはずだと感じています。

ifステートメントで「引数が多すぎます」というエラーが発生します。 grep -qの間のスペースを取り除いた後、予期されるエラー2項演算子を取得しました。

if [ grep -q ^$1 schemas.txt ]
then
        echo "Schema already exists. Please try again"
        exit 1
else
        echo "$@" >> schemas.txt
fi
142
Lauren

grepは、何かが見つかった場合(ゼロ)と何も見つからなかった場合(ゼロ以外)に異なる終了コードを返します。 ifステートメントでは、ゼロの終了コードは「true」にマップされ、ゼロ以外の終了コードはfalseにマップされます。さらに、grepには-q引数があり、一致したテキストを出力しません(ただし、終了ステータスコードのみを返します)。

したがって、次のようにgrepを使用できます。

if grep -q PATTERN file.txt; then
    echo found
else
    echo not found
fi

簡単に言うと、if [ -z "$var" ]…のようなことをすると、[は実際にはgrepのように実行中のコマンドであることがわかります。私のシステムでは/usr/bin/[です。 (まあ、技術的には、シェルにはおそらくそれが組み込まれていますが、それは最適化です。コマンドのように動作します)。同じように機能し、[は、trueの場合はゼロの終了コードを返し、falseの場合はゼロ以外の終了コードを返します。 (test[と同じですが、最後の]を除きます)

205
derobert

もう1つの簡単な方法は、grep -c

これは、パターンに一致する行数を出力します(終了コードとして返されません)。したがって、一致がない場合は0、一致する場合は1以上です。

したがって、パターンが3回以上一致することを確認する場合は、次のようにします。

if [ "$(grep -c "^$1" schemas.txt)" -ge 3 ]; then
  ...
54
amigal

私はこれに遅れていることを知っていますが、この短いバージョンが大好きです:

grep -q ^$1 schemas.txt && echo "Schema already exists. Please try again" || echo "$@" >> schemas.txt
7
Denis Pitzalis

[]の代わりに()を試してください。大括弧を使用しなくても、コードは機能します。

0
Ankit

ファイルの最初の単語をキャッチしたい場合は、-zwをgrepに追加する必要があります

if grep -qzw "^$1" file
then 
   ... 
else 
   ... 
fi

-zがないと、行の最初の単語が取得されます。 -wがないと、部分的な単語になります。

0
JJoao