Voici un moyen de le faire awk
(la sortie entière comme le fait le code dans votre réponse).
Lorsque vous finissez par retraiter la même entrée encore et encore, cela indique généralement qu'une autre approche pourrait être meilleure.
awk
est parfait pour le traitement de texte comme celui-ci. awk
les programmes sont beaucoup plus longtemps que les choses avec sed
, mais ils sont beaucoup plus faciles à lire et vous pouvez les ajouter des instructions d'impression pour faire le débogage beaucoup plus facile.
J'ai laissé mes déclarations de débogage dans (commenté). Vous pouvez les décommenter pour voir comment fonctionne le script.
Vous devez mettre le awk
programme quelque part et l'endroit le plus simple dans un cas d'utilisation unique comme celui-ci est de mettre le tout dans une seule chaîne entre guillemets sur la awk
ligne de commande.
De cette façon, vous n'avez pas besoin de le stocker dans un fichier séparé ou dans un fichier temporaire, il n'y a donc pas de gestion de fichiers impliquée et le script sera autonome.
Ce programme semble long, mais c'est presque tous les commentaires, les instructions de débogage et l'espace blanc.
#!/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
}
'