Hier ist eine Möglichkeit, dies zu tun awk
(die gesamte Ausgabe erfolgt gemäß dem Code in Ihrer Antwort).
Wenn Sie am Ende immer wieder dieselbe Eingabe erneut verarbeiten, weist dies normalerweise darauf hin, dass ein anderer Ansatz möglicherweise besser ist.
awk
ist perfekt für die Verarbeitung von Texteingaben wie diese. awk
Programme sind viel länger als die Dinge, mit sed
denen sie gemacht wurden , aber sie sind viel einfacher zu lesen und Sie können ihnen Druckanweisungen hinzufügen, um das Debuggen viel einfacher zu machen .
Ich habe meine Debugging-Anweisungen in (auskommentiert) gelassen. Sie können sie auskommentieren, um zu sehen, wie das Skript funktioniert.
Sie müssen das awk
Programm irgendwo platzieren, und der einfachste Ort in einem einzigen Anwendungsfall wie diesem ist, das Ganze in einer einfachen Zeichenfolge in Anführungszeichen in der awk
Befehlszeile zu setzen.
Auf diese Weise müssen Sie es nicht in einer separaten Datei oder in einer temporären Datei speichern, sodass keine Dateiverwaltung erforderlich ist und das Skript für sich allein steht.
Dieses Programm sieht lang aus, aber es sind fast alle Kommentare, Debugging-Anweisungen und Leerzeichen.
#!/bin/bash
## Whole awk program is one single quoted string
## on the awk command line
## so we don't need to put it in a separate file
## and so bash doesn't expand any of it
## Debugging statements were left in, but commented out
/usr/bin/cpuid | awk '
BEGIN { ## initialize variables - probably unnecessary
em = ""
ef = ""
fa = ""
mo = ""
si = ""
ps = ""
}
## get each value only once
## extended model is in field 4 starting at the third character
## of a line which contains "extended model"
/extended model/ && em == "" {
em = substr($4, 3)
##print "EM " em
}
## extended family is in field 4 starting at the third character
## of a line which contains "extended family"
/extended family/ && ef == "" {
ef = substr($4, 3)
##print "EF " ef
}
## family is in the last field, starting at the second character
## and is two characters shorter than the field "()"
## of a line which starts with "family"
## (so it does not match "extended family")
$1 == "family" && fa == "" {
##print NF " [" $NF "]"
##print "[" substr($NF, 2) "]"
l = length($NF) - 2
fa = substr($NF, 2, l)
##print "FA " fa
}
## model is in the third field, starting at the third character
## of a line which starts with "model"
## (so it does not match "extended model")
$1 == "model" && mo == "" {
mo = substr($3, 3)
##print "MO " mo
}
## stepping id is in field 4 starting at the third character
## of a line which contains "stepping id"
/stepping id/ && si == "" {
si = substr($4, 3)
##print "SI " si
}
## processor serial number is in field 4 starting at the third character
## of a line which contains "processor serial number:"
/processor serial number:/ && ps == "" {
ps = $4
##print "PS " ps
}
## Quit when we have all the values we need
em != "" && ef != "" && fa != "" && mo != "" && si != "" && ps != "" {
exit
}
END {
print em ef fa mo si " " ps
}
'