So erhalten Sie einen bestimmten Zeichenfolgenwert von einem SPHardwareDataType von Apple System Profiler

502
case

Ich benutze Bash, um Computer massenweise mit einem Teil der Seriennummer umzubenennen, was ziemlich einfach ist, aber mein Kunde hat verlangt, dass das Herstellungsjahr jeder Maschine an das Ende angehängt wird.

Es gibt eine Adresse:

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

Dabei steht das XXXXfür die letzten vier Ziffern der Seriennummer. Es ist ein Apple-Dienst, der einen länglichen XML-String mit der Modellnummer und dem Jahr zurückgibt. Ich kann die einzige 4-stellige Zahl im XML-Ergebnis der Apple.com-Abfrage nicht bereinigen und in meiner Variablen speichern.

Ich versuche das und bin verblüfft, warum es überhaupt nichts zurückgibt - wenn ich es alleine in einem Terminal laufen lasse, springt es einfach in die nächste Zeile.

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

Ist es wirklich offensichtlich, was ich falsch mache? Gibt es vielleicht nur einen besseren, weniger komplizierten Weg, dies zu tun?

3
Funktionieren alle Befehle für sich? (dh funktioniert curl wie beabsichtigt? ist awk wie beabsichtigt?) für cut und grep gleich. Toto vor 5 Jahren 0
Sieht so aus, als wollten Sie diese Seriennummer (Systemnummer)? `system_profiler SPHardwareDataType | awk '/ Seriennummer \ (System \) / ' `? JakeGould vor 5 Jahren 0
Versuchen Sie es mit der Option -P, um PCRE mit grep zu verwenden. Paulo vor 5 Jahren 0

1 Antwort auf die Frage

2
case

Also entdeckte ich, was ich tun musste, und fand heraus, warum mein einziger Liner nicht funktionierte. Ich musste es etwas weiter abbauen. Ich konnte schließlich den Computernamen auf ein Präfix für den Client setzen, die letzten sechs Ziffern der Seriennummer (ich weiß, dass dies ein bisschen willkürlich ist, aber es ist das, was der Client wollte) und das Jahr, in dem das Macbook oder der iMac gebaut wurde mit den folgenden Ich bin immer noch nicht sicher, warum mein einziger Liner nicht funktioniert. Ich denke, es liegt irgendwo ein abgekoppeltes Token vor. Ich konnte es tun, indem es als Toto-Funktion vorgeschlagen wurde:

#!/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 

Zwei Dinge - 1 - ältere Apple-Maschinen können Seriennummern mit einer unterschiedlichen Anzahl von Zeichen haben. Ich glaube nicht, dass sie im Rahmen meines Skriptlebens sein werden, also muss ich die Zeichen nicht zuerst zählen - dann kann Apple dieses Dienst irgendwann nicht mehr anbieten oder es neu formatieren, indem es eine weitere 4-stellige Zeichenfolge in die XML-Zeile hinzufügt, das wird das brechen.

Das sind akzeptable Risiken für mich, könnten dies aber in Zukunft brechen. Dies ist der einzige Weg, um das Jahr der Herstellung eines Apple-Computers an einer mir bekannten Befehlszeile in eine var zu bringen.

JC