我目前正在尝试学习 awk,因此我正在命令上尝试它disk utility
。
这是我运行时的输出Disk Utility list disk0
/dev/disk0 (内部,物理): #: 类型名称 大小标识符 0:GUID_partition_scheme *251.0 GB 磁盘0 1:EFI EFI 209.7 MB 磁盘0s1 2:Apple_HFS Macintosh HD 145.4 GB disk0s2 3:Apple_Boot Recovery HD 650.0 MB disk0s3 4:Linux 文件系统 48.0 GB disk0s4 5:Microsoft Basic Data WINDOWS 38.0 GB disk0s5 6:Linux 交换 18.8 GB disk0s6
现在如果我运行,diskutil list disk0 | awk 'NR > 2 {print}'
我会得到这个作为我的输出。
0:GUID_partition_scheme *251.0 GB 磁盘0 1:EFI EFI 209.7 MB 磁盘0s1 2:Apple_HFS Macintosh HD 145.4 GB disk0s2 3:Apple_Boot Recovery HD 650.0 MB disk0s3 4:Linux 文件系统 48.0 GB disk0s4 5:Microsoft Basic Data WINDOWS 38.0 GB disk0s5 6:Linux 交换 18.8 GB disk0s6
如您所见,输出符合预期。现在的问题是,当我尝试打印 $2、$3 和 $4 时,输出有时会打印“HD”,而它应该打印尺寸,还有其他类似问题。
diskutil list disk0 | awk 'NR > 2 {print $1}'
0: 1: 2: 3: 4: 5: 6:
预期结果
diskutil list disk0 | awk 'NR > 2 {print $2}'
GUID_分区_方案GUID_partition_scheme 电喷 苹果 HFS 苹果启动 Linux 微软 Linux
预期结果
GUID_分区_方案GUID_partition_scheme 电喷 苹果 HFS 苹果启动 Linux 文件系统 微软基本数据 Linux 交换
如您所见,命令输出与预期一致,直到 Linux 文件系统。这是因为单词中有空格吗?
这现在会影响其后的所有内容,例如
diskutil list disk0 | awk 'NR > 2 {print $3}'
显示器
*251.0 电喷 麦金塔电脑 恢复 文件系统 基本的 交换
何时应该显示
电喷 麦金塔高清 高清恢复 视窗
我怎样才能让 AWK 按照我期望的方式格式化?
答案1
你bash
可以做:
diskutil list disk0 | { read; read; while read i; do echo ${i:6:27}; done; }
- 前两个
read
s 是忽略前两行。 - 循环
while
逐行读取输入并打印所需的部分。
编辑:如果必须的话awk
,请使用这个:
diskutil list disk0 | awk 'NR>2{$0=substr($0,6,27);sub("^ +","",$0);print}'
NR>2
省略输出中的前两行substr()
删去相关部分sub()
删除前导空格- 最后
print
打印出这一行
答案2
diskutil
substr
输出格式为多个空格,以便以整齐的列输出。使用 awk 的函数提取所需的字段。
例如,从中提取类型和名称diskutil
。substr 函数从 diskutil 输出中提取字段。例如,名称字段从位置 6 开始,最长为 27 个字符。gsub 函数仅从字段中删除前导和尾随空格。
diskutil list disk0 | awk 'NR > 2 {
name=substr($0, 33,20); # name field - position 33, length 20 chars
gsub(/ /,"",name) # trim spacing
type=substr($0, 6, 27); # type field - position 6, length 27 chars
gsub(/ /,"",type) # trim spacing
print "name="name," type="type
}'