นี่คือวิธีที่จะทำในawk
(ผลลัพธ์ทั้งหมดตามที่ทำโดยรหัสในคำตอบของคุณ)
เมื่อคุณจบการประมวลผลอินพุตเดียวกันซ้ำแล้วซ้ำอีกมักจะบ่งชี้ว่าวิธีอื่นอาจดีกว่า
awk
เหมาะสำหรับการประมวลผลการป้อนข้อความแบบนี้ awk
โปรแกรมที่มีมากเกินกว่าสิ่งที่ทำมีsed
แต่พวกเขามีมากง่ายต่อการอ่านและคุณสามารถเพิ่มงบการพิมพ์ให้กับพวกเขาที่จะทำให้การแก้จุดบกพร่องมากได้ง่ายขึ้น
ฉันออกจากการแก้ไขข้อบกพร่องใน (ความเห็น) คุณสามารถยกเลิกการใส่เครื่องหมายข้อคิดเห็นเพื่อดูว่าสคริปต์ทำงานอย่างไร
คุณต้องวางawk
โปรแกรมไว้ที่ใดที่หนึ่งและสถานที่ที่ง่ายที่สุดในกรณีการใช้งานเพียงครั้งเดียวเช่นนี้คือการใส่ข้อมูลทั้งหมดลงในสตริงที่ยกมาเดี่ยวบนawk
บรรทัดคำสั่ง
วิธีนี้คุณไม่จำเป็นต้องจัดเก็บไว้ในไฟล์แยกต่างหากหรือในไฟล์ชั่วคราวดังนั้นจึงไม่มีการจัดการไฟล์ที่เกี่ยวข้องและสคริปต์จะทำงานด้วยตนเอง
โปรแกรมนี้ดูยาว แต่มันเป็นความคิดเห็นเกือบทั้งหมดการแก้ไขข้อผิดพลาดและพื้นที่สีขาว
#!/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
}
'