如何使用awk/sed更高效处理dmidecode输出数据
更高效的精简实现
原命令串联了3次文本处理进程,存在不必要的性能开销,以下两种单文本处理工具的实现都可以达到完全一致的输出效果,执行效率更高:
awk 实现(推荐)
仅需单次awk调用完成全部匹配、提取、输出逻辑,匹配完所有目标字段后直接退出进程,无需读取冗余输入:
dmidecode -t 4 | awk ' /Signature/ { for(i=1; i<=NF; i++) { if ($i == "Model") model = $(i+1) if ($i == "Stepping") stepping = $(i+1) } gsub(/,/, "", model) print model, stepping } /L1 Cache Handle/ { print " " $4 exit } ' >> data
逻辑说明
- 匹配到
Signature所在行时,遍历行内字段定位Model、Stepping后的取值,移除Model值自带的逗号后按原格式输出 - 匹配到
L1 Cache Handle所在行时,直接提取第4列的句柄值输出,随后立刻终止awk进程,避免继续读取后续无效内容 - 全程仅启动dmidecode、awk两个进程,无多余管道和grep调用,资源开销远低于原多管道写法
sed 实现
如果偏好sed写法,也可以通过正则捕获组完成提取,同样匹配完目标内容后直接退出:
dmidecode -t 4 | sed -n ' /Signature/s/.*Model \([0-9]\+\),.*Stepping \([0-9]\+\).*/\1, \2/p /L1 Cache Handle/ { s/.*Handle: *\(0x[0-9a-fA-F]\+\).*/ \1/p q } ' >> data
两种实现写入data文件的内容和原命令的输出完全一致,为:
49, 0 0x002E
内容的提问来源于stack exchange,提问作者foo
相关产品推荐
相关产品推荐

