我想用变量替换以下命令中的文本 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 磁盘,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
,则$var
是$6
,即第 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
}
}'