grep が何かを返すかどうかを確認するためのワンライナー?

grep が何かを返すかどうかを確認するためのワンライナー?

次のようなものを使用して、マシンが ThinkPad かどうかを確認しようとしています。

sudo dmidecode | grep ThinkPad

最終結果が true または false (または 1/0) を返すようにしたいです。

解決策は次のようになると思います:

sudo dmidecode | grep -c ThinkPad | test xargs -gt 0

しかし、ここでどのように適切に使用すればよいかわかりませんxargs

答え1

の後に終了ステータスのチェックを追加するだけでgrep、デフォルトでパイプラインの最後のコマンドから終了ステータスが常に取得されます。

sudo dmidecode | grep -q ThinkPad; echo $?

終了ステータスのみに関心があるため、-qからの出力を抑制するために使用します。grep


必要に応じてコマンドのグループ化を使用することもできますが、ここでは多少冗長です。

sudo dmidecode | { grep -q ThinkPad; echo $? ;}

答え2

これをチェック付きのシェル スクリプトとして使用する場合はif-qheemayl の提案どおりに使用してください。

if sudo dmidecode | grep -q Thinkpad
then
    echo "I'm a Thinkpad"
fi

ブロックはコマンドの終了ステータスをチェックするので、 を印刷して他のものと比較する代わりに、 の終了ステータスを直接if使用できます。grep$?

答え3

に触発されたヒーメールの答え:

sudo dmidecode | grep -q ThinkPad && echo true || echo false

これは、ThinkPad が grep によって見つかった場合は true を返し、見つからない場合は false を返します。

答え4

sudo dmidecode | grep -c ThinkPad | xargs test 0 -lt

必要な結果を得るには、xargsandコマンドとそのオペランドを再配置する必要があります。 ゼロ以外の (>0) の ThinkPad 構成行がある場合、これは true ステータスを返します。test

あるいは、テストコマンドのオペランドの順序を保持したい場合は、次のようにします。

sudo dmidecode | grep -c ThinkPad | xargs -I \{\} test \{\} -gt 0

そして、両方のコマンドで、$?次のように変数の値をチェックして、grep の成功/失敗の運命を決定します。

if sudo dmidecode | grep -c ThinkPad | xargs -I \{\} test \{\} -gt 0; then
   echo "success hooray!"
else 
   echo nothing
fi

関連情報