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(およびいくつかの簡単なヘルパーツール)を追加することをお勧めします。次のシェルスクリプトは私のテストケースで動作します。

#!/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

これはクリーンドライブを識別します(ディスクラベルエイリアスパーティションテーブルなし)。

パーティションテーブルとパーティションはありますが、パーティション(またはスワップスペース)にファイルシステムがないドライブを表示するには、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」から削除してください。これは2番目のオプションではうまく機能します(ただし、fdiskは "fdisk:can open /dev/sr0:media notfound"を介して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必要があります。

関連情報