AWK格式化磁盘工具命令格式不正确


0

我正在尝试学习awk,所以我在disk utility命令上尝试。

这是我跑步时的输出 Disk Utility list disk0

/ dev / disk0(内部,物理):
   #:TYPE NAME SIZE IDENTIFIER
   0:GUID_partition_scheme * 251.0 GB disk0
   1:EFI EFI 209.7 MB disk0s1
   2:Apple_HFS Macintosh HD 145.4 GB disk0s2
   3:Apple_Boot Recovery HD 650.0 MB disk0s3
   4:Linux Filesystem 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 disk0
   1:EFI EFI 209.7 MB disk0s1
   2:Apple_HFS Macintosh HD 145.4 GB disk0s2
   3:Apple_Boot Recovery HD 650.0 MB disk0s3
   4:Linux Filesystem 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_partition_scheme
EFI
Apple_HFS
Apple_Boot
Linux的
微软
Linux的

预期结果

GUID_partition_scheme
EFI
Apple_HFS
Apple_Boot
Linux文件系统
Microsoft基本数据
Linux交换

正如您所看到的那样,命令输出正如预期的那样直到Linux Filesystem。这是因为这个词中有空格?

例如,这会影响其后的所有其他内容

diskutil list disk0 | awk 'NR > 2 {print $3}' 显示器

* 251.0
EFI
苹果
复苏
文件系统
基本
交换

什么时候应该显示

EFI
Macintosh HD
恢复高清

视窗

如何按照我的预期让AWK格式化?

Answers:


1

bash你可以做:

diskutil list disk0 | { read; read; while read i; do echo ${i:6:27}; done; }
  • 前两个read是忽略第一个到行。
  • 所述while环路读取由线输入线,并打印所期望的部分。

编辑:如果必须awk,请使用:

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

这工作,但我不能使用awk格式化整个输出。
iProgram 2015年

@iProgram我编辑了我的答案,看到awk解决方案
混乱

@iProgram我不明白,你现在有一个awk和一个非awk解决方案,问题是什么?
混乱

我认为OP也希望打印其他领域(“整体输出”)。为此,他必须确定列号并用substr()如图所示的方法提取它们。
user1016274 2015年

@ user1016274是正确的。我想这样做'分区$ 1被格式化为$ 2'等等。这就是为什么我想拥有所有输出。
iProgram 2015年

1

diskutil输出格式化为多个空格,以整齐的列输出。使用awk substr函数提取所需的字段。

例如,从中提取类型和名称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
}' 

这根本没有改变输出。
iProgram 2015年

答案已经修改。
嫌疑人2015年

打印出正确的文件,但我现在不能使用awk格式化整个输出。
iProgram 2015年

答案现在使用substr函数直接在awk中编辑字段。
嫌疑人2015年

@iProgram,你说的是“格式化整个输出”。这怎么符合你的要求?
格伦杰克曼2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.