Inilah cara untuk melakukannya awk
(seluruh output seperti yang dilakukan oleh kode dalam jawaban Anda).
Ketika Anda akhirnya memproses ulang input yang sama berulang kali, biasanya menunjukkan bahwa pendekatan lain mungkin lebih baik.
awk
sangat cocok untuk memproses input teks seperti ini. awk
program jauh lebih lama daripada yang dilakukan dengan sed
, tetapi mereka jauh lebih mudah dibaca dan Anda dapat menambahkan pernyataan cetak untuk membuatnya lebih mudah debugging .
Saya meninggalkan pernyataan debugging saya di (berkomentar). Anda dapat menghapus tanda komentar mereka untuk menonton bagaimana skrip bekerja.
Anda harus meletakkan awk
program di suatu tempat dan tempat termudah dalam kasus penggunaan tunggal seperti ini adalah untuk meletakkan semuanya dalam satu string yang dikutip pada awk
baris perintah.
Dengan cara ini Anda tidak perlu menyimpannya dalam file terpisah atau dalam file sementara, jadi tidak ada manajemen file yang terlibat dan skrip akan berdiri sendiri.
Program ini terlihat panjang, tetapi hampir semua komentar, pernyataan debugging, dan spasi.
#!/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
}
'