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

Вот вывод, когда я запускаю Disk Utility list disk0

/dev/disk0 (internal, physical):
   #:                       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 Swap                         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 Swap                         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
Microsoft
Linux

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

GUID_partition_scheme
EFI
Apple_HFS
Apple_Boot
Linux Filesystem
Microsoft Basic Data
Linux Swap

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

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

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

*251.0
EFI
Macintosh
Recovery
Filesystem
Basic
Swap

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

EFI
Macintosh HD
Recovery HD

Windows

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

2 ответа2

1

выходные данные 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
}' 
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 печатает строку

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .