awk#!/usr/bin/awk -f # BEGIN 块会在读取输入之前执行,类似于 C 中的 main 函数 BEGIN { # 通过循环读取 /proc/cpuinfo 文件中的每一行,直到匹配到包含 "flags" 的行 while (!/flags/) if (getline < "/proc/cpuinfo" != 1) exit 1 # 检查 CPU 是否支持基本的 x86-64 指令集 if (/lm/&&/cmov/&&/cx8/&&/fpu/&&/fxsr/&&/mmx/&&/syscall/&&/sse2/) level = 1 # 如果支持基本指令集,还进一步检查是否支持更多扩展指令集 if (level == 1 && /cx16/&&/lahf/&&/popcnt/&&/sse4_1/&&/sse4_2/&&/ssse3/) level = 2 # 检查是否支持 AVX 和 AVX2 指令集,这些是高性能运算的关键 if (level == 2 && /avx/&&/avx2/&&/bmi1/&&/bmi2/&&/f16c/&&/fma/&&/abm/&&/movbe/&&/xsave/) level = 3 # 检查是否支持最新的 AVX512 指令集扩展,极大提升了高端运算性能 if (level == 3 && /avx512f/&&/avx512bw/&&/avx512cd/&&/avx512dq/&&/avx512vl/) level = 4 # 如果支持任何版本的 x86-64 指令集,输出对应的版本并退出 if (level > 0) { print "CPU supports x86-64-v" level; exit level + 1 } # 如果没有匹配到支持的指令集,脚本以退出码 1 结束 exit 1 }
脚本的开头是 #!/usr/bin/awk -f
,指定该脚本应由 awk
解释器执行,并使用 -f
来表示从文件中读取命令。
BEGIN
块中的代码会在读取输入之前执行,类似于其他编程语言中的初始化逻辑。这个脚本中,BEGIN
会首先开始从 /proc/cpuinfo
文件读取信息。
while (!/flags/) if (getline < "/proc/cpuinfo" != 1) exit 1
这段代码使用 getline
从 /proc/cpuinfo
文件中逐行读取,直到找到 flags
字段,这个字段包含了 CPU 支持的所有指令集信息。如果没有找到 flags
或读取失败,脚本会退出并返回 1。
一系列的 if
语句检查 flags
中是否存在特定指令集标志。每找到一组支持的指令集,level
变量就会递增,表示 CPU 支持的 x86-64 版本越来越高。
一旦确定 level
的值,脚本会输出 CPU 支持的 x86-64 版本,并通过 exit level + 1
退出。比如,如果 CPU 支持 avx512
,它会输出 CPU supports x86-64-v4
。
如果找不到任何支持的指令集,脚本以退出码 1 终止,表示当前 CPU 不支持 x86-64 的高级指令集。
确保脚本文件具有可执行权限:
bashchmod +x cpu.sh
运行脚本:
bash./cpu.sh
或者使用 awk
直接执行:
bashawk -f cpu.sh
本文作者:GYC
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!