AWK 格式化磁盘实用程序命令格式不正确

AWK 格式化磁盘实用程序命令格式不正确

我目前正在尝试学习 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; }
  • 前两个reads 是忽略前两行。
  • 循环while逐行读取输入并打印所需的部分。

编辑:如果必须的话awk,请使用这个:

diskutil list disk0 | awk 'NR>2{$0=substr($0,6,27);sub("^ +","",$0);print}'
  • NR>2省略输出中的前两行
  • substr()删去相关部分
  • sub()删除前导空格
  • 最后print打印出这一行

答案2

diskutilsubstr输出格式为多个空格,以便以整齐的列输出。使用 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
}' 

相关内容