Đây là một cách để làm điều đó awk
(toàn bộ đầu ra được thực hiện bởi mã trong câu trả lời của bạn).
Khi bạn kết thúc việc xử lý lại cùng một đầu vào lặp đi lặp lại, điều đó thường chỉ ra rằng cách tiếp cận khác có thể tốt hơn.
awk
là hoàn hảo để xử lý văn bản đầu vào như thế này. awk
các chương trình dài hơn rất nhiều so với những thứ được thực hiện sed
, nhưng chúng dễ đọc hơn nhiều và bạn có thể thêm các câu lệnh in vào chúng để làm cho việc gỡ lỗi dễ dàng hơn nhiều .
Tôi để lại các tuyên bố gỡ lỗi của tôi trong (nhận xét ra). Bạn có thể bỏ qua chúng để xem kịch bản hoạt động như thế nào.
Bạn phải đặt awk
chương trình ở một nơi nào đó và nơi dễ nhất trong một trường hợp sử dụng như thế này là đặt toàn bộ trong một chuỗi trích dẫn trên awk
dòng lệnh.
Bằng cách này, bạn không phải lưu trữ nó trong một tệp riêng biệt hoặc trong một tệp tạm thời, do đó không có quản lý tệp liên quan và tập lệnh sẽ tự đứng.
Chương trình này có vẻ dài, nhưng hầu như tất cả các bình luận, tuyên bố gỡ lỗi và khoảng trắng.
#!/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
}
'