Grep после grep - скрипт оболочки OSX
Я пытаюсь найти имя моего жесткого диска с помощью терминала OSX, используя system_profiler
команда. Я отправляю вывод в текстовый файл. Вот часть вывода...
Serial-ATA:
Intel ICH8-M AHCI:
Vendor: Intel
Product: ICH8-M AHCI
Link Speed: 1.5 Gigabit
Negotiated Link Speed: 1.5 Gigabit
Description: AHCI Version 1.10 Supported
FUJITSU MHY2160BH:
Capacity: 160.04 G
Часть, которую я ищу, это FUJITSU MHY2160BH:
, поэтому я хотел бы получить первую строку, которая начинается с 16 пробелов ПОСЛЕ Serial-ATA:
, В качестве выхода system_profiler
имеет переменное количество строк, я не хочу использовать grep -A
,
Я перепробовал все виды greps, awks и seds, но безрезультатно.
Какие-нибудь мысли? Приветствия.
4 ответа
Это намного проще (и быстрее) определить с помощью diskutil
чем system_profiler
:
diskutil info /dev/disk0 | grep 'Media Name:' | cut -f2 -d:
Больше мыслей:
system_profiler
дорогой. Обычно вы должны собирать только те типы данных, которые вас интересуют. Например:
system_profiler SPSerialATADataType SPPrintersDataType
Выполнение нескольких небольших команд, как правило, будет быстрее, чем запуск одного гиганта. system_profiler
(~700k в моей системе), а затем повторно отображать его (что требует повторного чтения всего файла несколько раз). Выполнение небольших команд может полностью избежать дорогостоящих типов данных (например, SPApplicationsDataType
). grep
было бы проще, если бы вы знали, что смотрите только информацию SATA.
Я бы еще использовал diskutil
чтобы получить эту конкретную информацию, хотя. Скорее всего, это будет намного быстрее и проще (по крайней мере, большую часть времени), и позволит вам получить правильный диск. Обе эти техники делают предположение о том, что вы хотите. Ваш подход ищет первый диск SATA. Мой подход смотрит на disk0. Правильный подход обычно заключается в том, чтобы посмотреть на загрузочный диск (/). Вы можете легко определить это, используя diskutil
снова:
diskutil info `diskutil list / | head -1` | grep 'Media Name:' | cut -f2 -d:
system_profiler |
awk '
/Serial ATA/ { flag = 1 }
flag && /^ [^ ]/ {print; exit}
'
Команда system_profiler также позволяет ограничить ее вывод одной категорией:
$ system_profiler SPSerialATADataType | grep Model: | head -1
Model: FUJITSU MHZ2120BH G1
$
Но я согласен с Робом Нейпиром, diskutil
лучший выбор для этого.
$ diskutil info -plist /dev/disk0 | awk '/<key>MediaName<\/key>/{getline;gsub(/<[^>]+>/,"");print;exit;}'
FUJITSU MHZ2120BH G1 Media