次のコマンドのテキスト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=6
6番目のフィールドの値$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
}
}'