Неправильное форматирование команды Дисковой утилиты в 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; }
- Первые два
read
s должны игнорировать первые строки. while
Цикл читает строку ввода построчно и печатает нужную часть.
Изменить: если это должно быть awk
, использовать этот:
diskutil list disk0 | awk 'NR>2{$0=substr($0,6,27);sub("^ +","",$0);print}'
NR>2
пропускает первые две строки в выводеsubstr()
режет релевантную частьsub()
удаляет ведущие пробелы- и наконец
print
печатает строку