问题:
所需列中的文本带有空格, SAMSUNG MZNLN128HCGR-000H1
不需要的列中的文本带有空格,请参见VENDOR
= M.2 SSD
awk 仅打印第一个单词。awk
不打印数据列。
lsblk -S |grep "MODEL\|SERIAL\|sdc"
NAME HCTL TYPE VENDOR MODEL REV SERIAL TRAN
sdc 8:0:0:0 disk M.2 SSD SAMSUNG MZNLN128HCGR-000H1 1.00 S206NX0H510879 usb
。
lsblk -S |grep "sdc"
sdc 8:0:0:0 disk M.2 SSD SAMSUNG MZNLN128HCGR-000H1 1.00 S206NX0H510879 usb
。
字段分隔符 = 制表符还是空格?
*
替换空格
&
替换制表符
lsblk -S |grep "sdc" |tr " " "*" |tr "\t" "&" #replace with * &
sdc**8:0:0:0****disk*M.2*SSD**SAMSUNG*MZNLN128HCGR-000H1****1.00*S206NX0H510879*******usb
。
不期望的输出:
lsblk -S |grep "$d2d" |awk '{$1=""; $2=""; $3=""; $4=""; $5=""; print;}'```
SAMSUNG MZNLN128HCGR-000H1 1.00 S206NX0H520889 usb
。
如何获得所需的
MODEL
列和
SERIAL
列的输出?
SAMSUNG MZNLN128HCGR-000H1 S206NX0H510879
。
使用:
neofetch --stdout |grep 'OS:'
操作系统:Kubuntu 22.04.3 LTS x86_64
awk -W version
mawk 1.3.4 20200120 ...
--
答案1
如何获取
MODEL 列和
SERIAL 列的所需输出?
用于lsblk -o
指定您想要输出哪些列(与-n
抑制标题一起),以及lsblk <dev>
指定要输出有关哪个设备的信息(通常与-d
禁用输出子设备一起)。
> lsblk -d -n -o 型号,序列号 /dev/sdc ST6000VN001-2BB186 ZCT2X6FK
当需要自定义格式时,可以与另一个 JSON 格式化程序lsblk -J
一起使用 JSON 输出:jq
> lsblk -J -S | jq -r'.blockdevices[] |"\(.model),s/n.\(.serial)"' 三星 SSD 870 EVO 2TB,序列号 S6PPNX0W312382K 三星 SSD 870 EVO 2TB,序列号 S6PPNX0W312387C ST6000VN001-2BB186,序列号 ZCT2X6FK ST6000VN001-2BB186,序列号 ZCT2WNZY
所以如果你真的想使用 awk,你可以这样定义风俗字段分隔符(希望)不会与常规输出冲突:
> lsblk -J -S \ | jq -r'.blockdevices[] | 加入(";")' \ | awk -F';' '{打印 $5 ",s/n。" $6}' 三星 SSD 870 EVO 2TB,序列号 S6PPNX0W312382K 三星 SSD 870 EVO 2TB,序列号 S6PPNX0W312387C ST6000VN001-2BB186,序列号 ZCT2X6FK ST6000VN001-2BB186,序列号 ZCT2WNZY
如果你想要特定的字段,你可以通过两种方式来实现 - 要么与前面提到的-J
相同-o
(通常是)相结合,-d
或者使用 jq 选择特定字段:
> lsblk -J -d -o 型号,序列号 | jq -r'.blockdevices[] | join(";")'
> lsblk -J -S | jq -r'.blockdevices[] | [.model,.serial] | join(";")'