当列中有空格时,如何打印 - awk?

当列中有空格时,如何打印 - awk?

问题:
所需列中的文本带有空格, 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(";")'

相关内容