lsblk + 如何仅打印没有文件系统的磁盘

lsblk + 如何仅打印没有文件系统的磁盘

我们只想打印没有的磁盘文件系统通过命令行

从下面的示例中我们可以看到sde磁盘没有文件系统

lsblk -o NAME,FSTYPE
NAME               FSTYPE
sda
├─sda1             xfs
└─sda2             LVM2_member
  ├─vg-LV_root   xfs
  ├─vg-LV_swap   swap
  ├─vg-LV_var    xfs
  └─vg-LV_docker xfs
sdb                ext4
sdc                ext4
sdd                ext4
sde

所以我们尝试以下命令来捕获没有 FS 的磁盘

lsblk -o NAME,FSTYPE | awk '$2 == "" { print $0 }'

我们得到

sda
sde

sda正如我们从上面打印的磁盘中看到的那样,但sda它是操作系统磁盘,因此命令行没有给出正确的输出

正确的输出应该是:

sde 

有什么建议或其他方法可以提供正确的输出吗?

lsblk -oNAME,FSTYPE,FSTYPE --noheadings --nodeps
sda
sdb  ext4   ext4
sdc  ext4   ext4
sdd  ext4   ext4
sde

答案1

我建议我们在方法中的lsblk中添加fdisk(以及一些简单的帮助工具)。以下 shellscript 在我的测试用例中有效,

#!/bin/bash

for i in $(lsblk -dno name|grep -v sr)
do
 LANG=C
 sudo fdisk -lu "/dev/$i" |
  tr '\n' ' ' |
   grep 'Disk ' |
    grep -v 'Disklabel type:' |
     grep -o "/dev/$i"
done

这标识了一个干净的驱动器(没有任何磁盘标签别名分区表)。

如果您希望查看带有分区表和分区的驱动器,但任何分区中都没有文件系统(也没有交换空间),请尝试以下 shellscript,它仅使用 lsblk(以及一些简单的帮助工具),

#!/bin/bash

for i in $(lsblk -dno name|grep -v sr)
do
 LANG=C
 echo -n "/dev/$i "
 lsblk -lno fstype "/dev/$i" | tr '\n' ' '
 echo ""
done | sed 's/ *$//' | grep -v '\ [a-z]*'

编辑:

如果您有时想查看 CD/DVD 驱动器,请|grep -v sr从“for-line”中删除。这在第二种选择中效果很好(但在第一种选择中效果不佳,因为 fdisk 可以通过“fdisk:无法打开 /dev/sr0:找不到介质”将您从 do 循环中抛出)。

答案2

仅基于您问题中的输入/输出:

$ cat tst.awk
NF == 1 { hits[$1] }
/^[^[:alpha:]]/ { delete hits[prev] }
{ prev = $1 }
END {
    for ( name in hits ) {
        print name
    }
}

$ cat file | awk -f tst.awk
sde

显然替换cat filelsblk -o NAME,FSTYPE.

答案3

您还需要检查PTTYPE,分区表不是文件系统。--no-deps如果您只对磁盘感兴趣,您还可以使用删除所有子设备:

$ lsblk -oNAME,PTTYPE,FSTYPE --noheadings --nodeps | awk '$2 == "" && $3 == "" { print $0 }'
sdb

但这也取决于您对“没有文件系统的磁盘”的定义 - 正如我所说,分区表不是文件系统,因此您的命令给出了有效的结果,然后存在一个问题:带有分区表的磁盘是否具有分区是否为空。如果您希望返回带有分区表但没有分区的磁盘,则需要使用比lsblk这更复杂的东西。

相关内容