Aquí hay una manera de hacerlo awk
(toda la salida como lo hace el código en su respuesta).
Cuando termina reprocesando la misma entrada una y otra vez, generalmente indica que otro enfoque podría ser mejor.
awk
es perfecto para procesar entradas de texto como esta. awk
los programas son mucho más tiempo que las cosas se hagan con sed
, pero son mucho más fáciles de leer y se puede agregar instrucciones de impresión para ellos para hacer la depuración mucho más fácil.
Dejé mis declaraciones de depuración en (comentado). Puede descomentarlos para ver cómo funciona el guión.
Debe colocar el awk
programa en algún lugar y el lugar más fácil en un caso de uso único como este es colocar todo en una sola cadena entre comillas en la awk
línea de comando.
De esta manera, no tiene que almacenarlo en un archivo separado o en un archivo temporal, por lo que no hay gestión de archivos involucrada y el script se mantendrá por sí solo.
Este programa parece largo, pero es casi todos los comentarios, declaraciones de depuración y espacios en blanco.
#!/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
}
'