パイプラインコマンドのスクリプトの下の演算子

パイプラインコマンドのスクリプトの下の演算子

Ubuntu 18.04を使用していますansible。デフォルトでは、grepの後の行数が「2個未満」の場合です。

次のパイプ構造を使用して番号を取得できます。

realm list | grep active-directory | wc -l

結果が2より小さいかどうかをテストする方法は?

答え1

if [ "$(realm list | grep -c -wF active-directory)" -lt 2 ]; then
    echo is less than 2
else
    echo is 2 or more
fi

grep計算できます。ここでは、その事実を使用して単語を含む行数を計算しますactive-directory

-cオプションを使用すると、一致する行数がgrep返されます。grepこの-Fオプションは正規表現の一致を無効にし、grep代わりに文字列比較を使用します。

この-wオプションは非標準ですが、通常は実装されています。与えられたパターンが単一の単語になるように強制します。言い換えれば、一致は、与えられた文字列の両側に単語以外の文字があるかどうかを意味します。単語以外の文字はすべての文字です。外部コレクション内のすべて[[:alnum:]_]、つまり英数字やアンダースコアではないすべて。つまり、 と組み合わせて使用​​すると一致しactive-directory3ません。active-directory-wgrepinactive-directory

答え2

また、これを行うことができます

if realm list | awk '/active-directory/ && n++ {exit 1}'; then
  echo less than 2
else
  echo 2 or more
fi

awk2行目にが含まれていることを見つけるように指示しますactive-directory。これにより、すでに答えを持っているときにすべての一致を見つけるのに苦労することがなくなります。

答え3

ソリューションを提供してくれた@ctrl-alt-delorに感謝します。

test $(realm list | grep active-directory | wc -l) -lt 2 && echo true || echo false

test標準であるPOSIXユーティリティ

関連情報