awkの変数の問題

awkの変数の問題

次のコマンドのテキストsdを変数に置き換えたいと思います。

lsblk -r --output NAME,MOUNTPOINT | awk -F  \/ '/sd/ { dsk=substr($1,1,3);dsks[dsk]+=1 } END { for ( i in dsks ) { if (dsks[i]==1) print i } }'

私は試した:

lsblk -r --output NAME,MOUNTPOINT | awk -F -v dev=sd \/ '/{print $dev}/ { dsk=substr($1,1,3);dsks[dsk]+=1 } END { for ( i in dsks ) { if (dsks[i]==1) print i } }'

しかし、これはうまくいきません。誰が私を助けることができますか?ありがとうございます!

awkにパイプされたlsblkの出力は次のとおりです。

NAME MOUNTPOINT
sda 
sda1 /boot/efi
sda2 /var/lib/kubelet/pods/fae467d4-05e9-4aea-8341-0d1524a3ec9c/volume-subpaths/tigera-ca-bundle/calico-kube-controllers/1
sda3 
sdb 
sdc 
sr0 

予想される出力は次のとおりです。

sdb
sdc

したがって、sdで始まるすべてのディスクはos disk、sdaを除いて

答え1

この-Fオプションはフィールド区切り文字を設定します。途中で他のオプションを配置することはできませんawk -F -v dev=sd \/。これはデフォルトでフィールド区切り文字を文字列に設定します-v

$ awk -F -v 'BEGIN{print FS}'
-v

dev=sd実行する必要があるスクリプトに解析されるため、そうではありません。とにかく、あなたが望むものは:

awk -F '/' -v dev=sd ' awk script here ' file

次に、/ /使用中のコンテキストの構文には正規表現が必要です。変数を拡張しません。また、awk変数はで始まりません$フィールドする。カスタム変数varではありません$var。実際、$varこれは「番号が格納された値であるフィールド」を意味しますvar。したがって、裏側はvar=66番目のフィールドの値$varです。$6

逆に、変数を一致させるには~演算子が必要です。したがって、これらすべてをまとめると、私の推測では(入力や期待される出力を表示していないので、推測しかできません)、次のようなものが欲しいでしょう。

lsblk -r --output NAME,MOUNTPOINT | 
  awk -F '/' -v dev=sd  '
    $0 ~ dev { 
     dsk=substr($1,1,3);
     dsks[dsk]+=1 
    } 
    END { 
     for ( i in dsks ) { 
      if (dsks[i]==1) print i 
     }
   }'

関連情報