此命令
udisksctl status
使用 Ubuntu 20.04.3 得到:
MODEL REVISION SERIAL DEVICE
--------------------------------------------------------------------------
SanDisk Extreme 0001 AA010302161107080264 sdb
ATAPI DVD A DH17A3L 8H3D ATAPI_DVD_A_DH17A3L sr0
KINGSTON SA400S27230G S3Z40107 50016B7683B02C0B sda
Optiarc DVD RW AD-7580A 1.04 Optiarc_DVD_RW_AD-7580A sr0
HL-DT-STDVD-RAM GH22NS30 2.00 HL-DT-STDVD-RAM_GH22NS30 sr0
Floppy Drive fd0
Generic Flash Disk 8.07 162194AF sdc
目标是按每行(标题之后)的最后 3 个字符排序,得到:
Floppy Drive fd0
KINGSTON SA400S27230G S3Z40107 50016B7683B02C0B sda
SanDisk Extreme 0001 AA010302161107080264 sdb
Generic Flash Disk 8.07 162194AF sdc
Optiarc DVD RW AD-7580A 1.04 Optiarc_DVD_RW_AD-7580A sr0
ATAPI DVD A DH17A3L 8H3D ATAPI_DVD_A_DH17A3L sr0
HL-DT-STDVD-RAM GH22NS30 2.00 HL-DT-STDVD-RAM_GH22NS30 sr0
我获得了部分成功
udisksctl status | tail -n+3 | rev | sort -b -k1.1 | rev | grep 'sd\|hd\|fd\|sr\|st'
udisksctl status | tail -n+3
从底部(尾部)到第 3 行,从而切出 2 行标题:
MODEL REVISION SERIAL DEVICE
--------------------------------------------------------------------------
udisksctl status | tail -n+3 | rev |
反转,将行中的最后一个字符移到行的最前面。
udisksctl status | tail -n+3 | rev | sort -b -k1.1
sort -b
= 忽略前导空格
-k1.1
= 按照忽略空格后的键首字母排序
udisksctl status | tail -n+3 | rev | sort -b -k1.1 | rev
撤消 逆转
udisksctl status | tail -n+3 | rev | sort -b -k1.1 | rev | grep 'sd\|hd\|fd\|sr\|st'
使用 grep 突出显示:
sd
Scsi 设备hd
硬盘驱动器fd
软盘驱动器sr
Scsi ROM、cdrom、dvdst
Scsi 磁带驱动器- ...
为简单起见,重点关注最后 3 个字母。问题是如何进行排序以获得:
fd0
sda
sdb
sdc
sr0
sr0
sr0
因为如上所示的问题是按最后 1 个字母排序,而不是按最后 3 个字母排序:
fd0
sr0
sr0
sr0
sda
sdb
sdc
如何按一行中的最后 3 个字符排序?(每行的长度不同。)
答案1
尝试这个:
udisksctl status | awk '{ print $NF,$0 }' | sort -k1,1 -n | cut -f2- -d' '
这也照顾了较长的字符串,因为nvme0n1
排序是按最后一列进行的,而不是按字符数进行的。
我没有 udiskctl,但通过将您的列表复制到文件sortof
、添加 NVM 驱动器进行验证并添加文件进行了测试:
pg@TREX:~/test$ cat sortof | awk '{ print $NF,$0 }' | sort -k1,1 -n | cut -f2- -d' '
HL-DT-STDVD-RAM GH22NS30 2.00 HL-DT-STDVD-RAM_GH22NS30 sr0 Floppy Drive fd0
KINGSTON SA400S27230G S3Z40107 50016B7683B02C0B nvme1p
KINGSTON SA400S27230G S3Z40107 50016B7683B02C0B sda
SanDisk Extreme 0001 AA010302161107080264 sdb
Generic Flash Disk 8.07 162194AF sdc
ATAPI DVD A DH17A3L 8H3D ATAPI_DVD_A_DH17A3L sr0
Optiarc DVD RW AD-7580A 1.04 Optiarc_DVD_RW_AD-7580A sr0
...因此当您通过管道传输 udiskctl 输出时它也应该可以工作。