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 磁盘,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 
     }
   }'

相关内容