コマンド出力をテキストで表示する方法

コマンド出力をテキストで表示する方法

コマンド出力を文字列と比較する必要があります。シナリオは次のとおりです。

pvs_var=$(pvs | grep "sdb1") 

したがって、pvs varは次のようになります:/ dev / sdb1 vg_name lvm2 a-- 100.00g 0

if [[ $($pvs_var | awk '{ print $2 }') = vg_name ]]; then
    do something
fi

問題は、if文の出力が次のようになることです。

-bash: /dev/sdb1: Permission denied

私はこの動作を理解していません。ありがとう

答え1

$pvs_varawkに文字列を渡すのではなく、コマンドで実行したいのです。

この問題を解決するには、echoifステートメントにまたはを追加してください。printf

if [[ $(echo "$pvs_var" | awk '{ print $2 }') = vg_name ]]; then
    do something
fi

答え2

JSON形式で出力を取得すると、より安定した方法で情報を抽出できます。

pv_info=$(pvs -o pv_all,vg_all --unit b --nosuffix --reportformat json)
sdb1_vg=$(
  printf '%s\n' "$pv_info" |
    jq -r '.report[].pv[]|select(.pv_name == "/dev/sdb1").vg_name'
)

if [ "$sdb1_vg" = vg_name ]; then...

または、シェルの代わりにJSONライブラリで適切なプログラミング言語を使用してください(ksh93JSONは将来のバージョンでサポートされていますが)。

(LVM 2.02.158(2016)以降が必要です--reportformat json。)

1つのクエリのみを実行する場合は、次のようpvsにすべての操作を実行できます。

sdb1_vg=$(
  pvs -o vg_name -S pv_name=/dev/sdb1 --no-heading --config 'log{prefix=""}'
)

(LVM 2.02.107(2014)以降が必要です-S。)

覚えて変数参照そして避けるecho

答え3

出力でVGを比較するには、前処理が容易になります。

# if you still need it
pvs_var=$(pvs | grep "sdb1") 
vg_name=$(pvs | grep "sdb1" | awk '{print $2}')
if [ "$vg_name" = "vg_name" ]; then
  echo do something
fi

何をしてください

$($pvs_var | awk '{ $2 印刷 }')

$( ... )コマンド置換は最初のコマンドで始まります$pvs_var。 Bashは変数の値を忠実に変更し、実行を試みます。それはあなたが望むものではありません。

別のオプションは、変数をawkコマンドに文字列として送信することです。

# ...
if [ $(awk '{print $2}' <<< "$pvs_var") = "vg_name" ]; then
# ...

ここでのコマンドの置き換えは、awkを呼び出してその入力をstdin(変数の内容)に渡すことです$pvs_var

答え4

awkだけを試してみることができます。

pvs | awk -v search='vg_name' '/sdb1/&&$2==search{exit 1}' || echo "ok"

関連情報