Как получить конкретное строковое значение из профилировщика системы Apple SPHardwareDataType

375
case

Я использую Bash для массового переименования компьютеров, используя часть серийного номера, что довольно легко, но мой клиент попросил добавить год выпуска каждой машины до конца.

Есть адрес:

curl -s https://support-sp.apple.com/sp/product?cc=XXXX 

Где символ XXXXпредставляет последние четыре цифры серийного номера. Это сервис Apple, который возвращает длинную строку XML с номером модели и годом. Я не могу на всю жизнь получить единственное 4-значное число в XML-результате запроса Apple.com, очищенного и выгруженного в мою переменную.

Я пытаюсь это сделать, и зашла в тупик, почему он вообще ничего не возвращает - когда я запускаю его один в терминале, он просто переходит на следующую строку.

curl -s https://support-sp.apple.com/sp/product?cc=`system_profiler SPHardwareDataType | awk '/Serial/ ' | cut -c 9-` | grep -o '(?<!\d)\d(?!\d)' 

Действительно ли очевидно, что я делаю не так? Может быть, есть просто лучший, менее сложный способ сделать это?

3
Все команды работают самостоятельно? (т.е. работает ли curl как задумано? работает ли awk как задумано? то же самое для cut и grep. Toto 6 лет назад 0
Похоже, вы хотите этот «Серийный номер (система)» номер? `system_profiler SPHardwareDataType | awk '/ Серийный номер \ (system \) / ' `? JakeGould 6 лет назад 0
Попробуйте с опцией -P использовать PCRE с grep. Paulo 6 лет назад 0

1 ответ на вопрос

2
case

Итак, я обнаружил, что мне нужно было сделать, и выяснил, почему мой один лайнер не работал. Мне нужно было сломать это немного дальше. Мне удалось наконец установить имя компьютера в качестве префикса для клиента, последние шесть цифр серийного номера (я понимаю, что это немного произвольно, но это то, что хотел клиент) и год, когда был создан Macbook или iMac. используя следующее. Я до сих пор не уверен, почему мой единственный лайнер не работает, я думаю, это потому, что где-то есть несвязанный токен. Я был в состоянии сделать это функция за функцией, как Тото вроде:

#!/bin/bash   # Logging exec 3>&1 4>&2 trap 'exec 2>&4 1>&3' 0 1 2 3 exec 1>>/private/var/log/"$(basename $0)"_"$(date "+%Y%m%d_%H%M%S")".log 2>&1  # Variables theSerial=$(system_profiler SPHardwareDataType | awk '/Serial/ ' | cut -c 7-) theModel=$(system_profiler SPHardwareDataType | grep 'Model Name:' | awk -F': ' '') lastFour=$(system_profiler SPHardwareDataType | awk '/Serial/ ' | cut -c 9-) theYear=$(curl -s https://support-sp.apple.com/sp/product?cc=$lastFour | grep -o '\d\d\d\d')  #XXX is a client code slug # Begin script echo "Begin script: $(theNow)"  # Write: ComputerName, HostName, LocalHostName, NetBIOS touch /private/var/log/fv2.log  scutil --set ComputerName "XXX-$theSerial-$theYear" #XXX is a client code slug scutil --set HostName "XXX-$theSerial-$theYear" scutil --set LocalHostName "XXX-$theSerial-$theYear" defaults write /Library/Preferences/SystemConfiguration/com.apple.smb.server NetBIOSName "XXX-$theSerial-$theYear" echo "XXX-" > /private/var/log/fv2.log   # Finish up echo "Finish Script: $theNow" exit 0 

Две вещи - 1 - старые машины Apple могут иметь серийные номера с различным количеством символов. Я не думаю, что они попадут в сферу жизни моего сценария, поэтому мне не нужно сначала считать символы - тогда Apple может когда-нибудь прекратить предоставлять эту услугу или переформатировать ее, добавив еще одну строку из 4 цифр в строку xml, который сломает это.

Это приемлемые риски для меня, но может сломать это в будущем. Это единственный способ получить год выпуска компьютера Apple в виде переменной в командной строке, о которой я знаю.

JC

Похожие вопросы