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}
'

Piple выход к этому:

awk '/^                / {print $1, $2; 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
Другие вопросы по тегам