【发布时间】:2018-07-03 00:17:07
【问题描述】:
我倾向于经常使用 macos 命令diskutil info -all,它包含的信息比我通常想要的要多得多,它以一种列表类型的格式显示它,并且连接了 19 个硬盘驱动器,这意味着需要大量滚动.我试图从diskutil info -all 的输出中仅提取四位信息,然后将其格式化为一个四列的表。
我正在使用 grep 来获取我想要的确切信息:
diskutil info -all | grep -e "Device Identifier:" -e "Device Node:" -e "Volume Name:" -e "Volume UUID:"
结果如下:
Device Identifier: disk0
Device Node: /dev/disk0
Volume Name: Not applicable (no file system)
Device Identifier: disk1
Device Node: /dev/disk1
Volume Name: Not applicable (no file system)
Device Identifier: disk1s1
Device Node: /dev/disk1s1
Volume Name: EFI
Device Identifier: disk1s2
Device Node: /dev/disk1s2
Volume Name: Old-Timemachine-Lion
Volume UUID: D04D1888-ABD9-3480-9692-60ECA458C372
Device Identifier: disk1s3
Device Node: /dev/disk1s3
Volume Name: Backup-Lion
Volume UUID: 8C737824-F790-324B-AC4C-6F398D6CE947
Device Identifier: disk1s4
Device Node: /dev/disk1s4
Volume Name: Old-Timemachine-Garnet
Volume UUID: DECBEC2C-ADFD-397E-88B6-B9CC962E00E4
我想去掉第一列,然后将第二列分成四列,每个参数一列。上面的 sn-p 输出如下所示:
disk0 /dev/disk0 Not applicable (no file system)
disk1 /dev/disk1 Not applicable (no file system)
disk1s1 /dev/disk1s1 EFI
disk1s2 /dev/disk1s2 Old-Timemachine-Lion D04D1888-ABD9-3480-9692-60ECA458C372
disk1s3 /dev/disk1s3 Backup-Lion 8C737824-F790-324B-AC4C-6F398D6CE947
disk1s4 /dev/disk1s4 Old-Timemachine-Garnet ECBEC2C-ADFD-397E-88B6-B9CC962E00E4
我发现我可以使用 cut 删除第一列,并认为我应该能够使用 printf 和命令替换来格式化为列。类似的东西:
printf "%14s %14s %14s %14s\n" "$(diskutil info -all | grep -e "Device Identifier:" -e "Device Node:" -e "Volume Name:" -e "Volume UUID:" | cut -c 30-70)"
它可以摆脱第一列但不格式化,就像 printf 不工作一样。输出如下:
disk0
/dev/disk0
Not applicable (no file system)
disk1
/dev/disk1
Not applicable (no file system)
disk1s1
/dev/disk1s1
EFI
disk1s2
/dev/disk1s2
Old-Timemachine-Lion
D04D1888-ABD9-3480-9692-60ECA458C372
disk1s3
/dev/disk1s3
Backup-Lion
8C737824-F790-324B-AC4C-6F398D6CE947
disk1s4
/dev/disk1s4
Old-Timemachine-Garnet
DECBEC2C-ADFD-397E-88B6-B9CC962E00E4
我不擅长使用 shell 脚本,所以我怀疑我的方法是最好的方法,但这里缺少什么和/或做错了什么?我想学习。
【问题讨论】:
-
在
diskutils结果中,每行开始前是否有空格?或者它是在 SO 中格式化时引入的? -
@sjsam -
diskutil在每行的开头放置三个空格,因此 awk 中的sub(/^ */,"")将提供足够的修剪。 -
@sjsam,ghoti 是正确的。 diskutil 在每行的开头插入了三个空格。我不是特别关心他们。也许有一个或两个或三个空间将结果从边缘移开更漂亮?