Ecco un modo per farlo in awk
(l'intero output come fatto dal codice nella tua risposta).
Quando si finisce per rielaborare più volte lo stesso input, di solito indica che un altro approccio potrebbe essere migliore.
awk
è perfetto per elaborare l'immissione di testo in questo modo. awk
i programmi sono molto più lunghi delle cose fatte sed
, ma sono molto più facili da leggere e puoi aggiungere istruzioni di stampa per rendere il debugging molto più semplice.
Ho lasciato le mie dichiarazioni di debug (commentate). Puoi decommentarli per vedere come funziona lo script.
Devi mettere il awk
programma da qualche parte e il posto più semplice in un singolo caso d'uso come questo è quello di mettere il tutto in una singola stringa tra virgolette sulla awk
riga di comando.
In questo modo non è necessario memorizzarlo in un file separato o in un file temporaneo, quindi non è necessaria la gestione dei file e lo script rimarrà da solo.
Questo programma sembra lungo, ma quasi tutti i commenti, le dichiarazioni di debug e gli spazi bianchi.
#!/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
}
'