🔖

lsblkの表示形式

2024/03/09に公開

linux等のOSのファイルシステム表示CLIに、lsblkというものがある。おなじみの表示は次の通りだろう。

$ lsblk 
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 223.6G  0 disk 
├─sda1   8:1    0 170.1G  0 part /
├─sda2   8:2    0     1K  0 part 
└─sda5   8:5    0     5G  0 part [SWAP]
sdb      8:16   0   5.5T  0 disk 
└─sdb1   8:17   0   5.5T  0 part /V*****

情報量にとくに驚きはないが、これらの標準に加えて、 -o オブションで表示項目を増減することができる。

色々見繕って指定してみた。尚これで全てではない。

$ lsblk -o kname,mountpoint,label,partlabel,wwn,pkname,model 
KNAME MOUNTPOINT LABEL      PARTLABEL WWN                PKNAME MODEL
sda                                   0x5**1b444a6****22b        SanDisk SDSSDA**
sda1  /                               0x5**1b444a6****22b sda    
sda2                                  0x5**1b444a6****22b sda    
sda5  [SWAP]                          0x5**1b444a6****22b sda    
sdb                                                             HD-EDS-D        
sdb1  /V*****     REC******* R*****                       sdb    

小生の環境ではこのとおり。微妙に伏せ字。

識別子に使えそうな情報が多数でてくる。なかなか使い出がありそうだ。だが問題はここからだ。

これらの形式、人間が眺める分には問題ないが、一見固定カラムで出力されてるかのようでいて、その実、ご丁寧に項目名や中身で伸縮してくれるため、スクリプト等で処理するには非常に扱いづらい。

困ってる人は何人か見受けられる。

https://stackoverflow.com/questions/63499650/lsblk-command-to-redirect-the-output-to-csv-file-using-shell-command-or-shell-sc

もっと扱いやすい形式はないのか?

あったよ orz

raw

シェルスクリプト等で処理する場合に、格段に楽なのはこれだろう。

$ lsblk -o kname,mountpoint,label,partlabel,wwn,pkname,model --raw
KNAME MOUNTPOINT LABEL PARTLABEL WWN PKNAME MODEL
sda    0x5**1b444a6****22b  SanDisk\x20SDSSDA**
sda1 /   0x5**1b444a6****22b sda 
sda2    0x5**1b444a6****22b sda 
sda5 [SWAP]   0x5**1b444a6****22b sda 
sdb      HD-EDS-D\x20\x20\x20\x20\x20\x20\x20\x20
sdb1 /V***** REC******* R*****  sdb 

空欄カラムは厳格にスキップされてるようだ。

空白をカンマに置換してみると、ほぼそのまま使えるCSVが出来上がる。

$ lsblk -o kname,mountpoint,label,partlabel,wwn,pkname,model --raw | tr " " ,
KNAME,MOUNTPOINT,LABEL,PARTLABEL,WWN,PKNAME,MODEL
sda,,,,0x5**1b444a6****22b,,SanDisk\x20SDSSDA**
sda1,/,,,0x5**1b444a6****22b,sda,
sda2,,,,0x5**1b444a6****22b,sda,
sda5,[SWAP],,,0x5**1b444a6****22b,sda,
sdb,,,,,,HD-EDS-D\x20\x20\x20\x20\x20\x20\x20\x20
sdb1,/V*****,REC*******,R*****,,sdb,

一部エスケープされてしまう文字があるが、「マウントしてないデバイスを検索てほげほげするようなスクリプト」を書く場合であれば、これで十分であろう。

json

みんな大好きjsonももちろんある。(あるんかーい)

$ lsblk -o kname,mountpoint,label,partlabel,wwn,pkname,model -J
{
   "blockdevices": [
      {"kname": "sda", "mountpoint": null, "label": null, "partlabel": null, "wwn": "0x5**1b444a6****22b", "pkname": null, "model": "SanDisk SDSSDA**"},
      {"kname": "sda1", "mountpoint": "/", "label": null, "partlabel": null, "wwn": "0x5**1b444a6****22b", "pkname": "sda", "model": null},
      {"kname": "sda2", "mountpoint": null, "label": null, "partlabel": null, "wwn": "0x5**1b444a6****22b", "pkname": "sda", "model": null},
      {"kname": "sda5", "mountpoint": "[SWAP]", "label": null, "partlabel": null, "wwn": "0x5**1b444a6****22b", "pkname": "sda", "model": null},
      {"kname": "sdb", "mountpoint": null, "label": null, "partlabel": null, "wwn": null, "pkname": null, "model": "HD-EDS-D        "},
      {"kname": "sdb1", "mountpoint": "/V*****", "label": "REC*******", "partlabel": "R*****", "wwn": null, "pkname": "sdb", "model": null}
   ]
}

Discussion