Неправильное форматирование команды Дисковой утилиты в AWK

Я пытаюсь выучить awk в данный момент, и поэтому я пытаюсь это на disk utility команда.

Вот вывод, когда я бегу Disk Utility list disk0

/dev/disk0 (внутренний, физический):
   #: ИДЕНТИФИКАТОР ИМЯ ТИПА
   0:      GUID_partition_scheme                        *251,0 ГБ, диск0
   1:                        EFI EFI                     209,7 МБ disk0s1
   2:                  Apple_HFS Macintosh HD, 145,4 ГБ, диск0s2
   3:                 Apple_Boot Recovery HD             650.0 МБ диск0s3
   4: Файловая система Linux 48,0 ГБ disk0s4
   5: WINDOWS с основными данными Microsoft 38,0 ГБ disk0s5
   6:                 Linux Swap                         18,8 ГБ диск0s6

Теперь, если я бегу diskutil list disk0 | awk 'NR > 2 {print}' Я получаю это как свой вывод.

   0:      GUID_partition_scheme                        *251,0 ГБ, диск0
   1:                        EFI EFI                     209,7 МБ disk0s1
   2:                  Apple_HFS Macintosh HD, 145,4 ГБ, диск0s2
   3:                 Apple_Boot Recovery HD             650.0 МБ диск0s3
   4: Файловая система Linux 48,0 ГБ disk0s4
   5: WINDOWS с основными данными Microsoft 38,0 ГБ disk0s5
   6:                 Linux Swap                         18,8 ГБ диск0s6

Как вы видите, результат соответствует ожиданиям. Проблема сейчас в том, что когда я пытаюсь напечатать 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
Microsoft
Linux

Ожидаемый результат

GUID_partition_scheme
EFI
Apple_HFS
Apple_Boot
Файловая система Linux
Основные данные Microsoft
Linux Swap

Как вы можете видеть выходные данные команды, как ожидалось, до файловой системы Linux. Это из-за пробелов в слове?

Теперь это влияет на все остальное, например, после него.

diskutil list disk0 | awk 'NR > 2 {print $3}' дисплеи

* 251,0
EFI
макинтош
восстановление
Файловая система
основной
Своп

когда это должно показать

EFI
Macintosh HD
Восстановление HD

Windows

Как бы получить AWK для форматирования, как я ожидал?

2 ответа

diskutil вывод форматируется с несколькими пробелами для вывода в аккуратные столбцы. Извлеките поля, необходимые с помощью awk's 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
}' 

С 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 печатает строку
Другие вопросы по тегам