尝试使用 awk 解析 lscpu 输出但无法正确解析
Trying to use awk to parse lscpu output but can't get it right
本质上我想要的是从lscpu中提取L3缓存的字节大小。棘手的部分是 lscpu 使用的单位在版本之间不一致,我需要的必须适用于所有版本(包括 --bytes 选项可用之前的版本)。据我所知,lscpu 将使用 K、KiB、M 或 MiB,这就是我要解析的内容。
这是 lscpu 输出的内容:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 16
On-line CPU(s) list: 0-15
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 16
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 60
Model name: Intel Core Processor (Haswell, no TSX, IBRS)
Stepping: 1
CPU MHz: 2299.998
BogoMIPS: 4599.99
Virtualization: VT-x
Hypervisor vendor: KVM
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 4096K
L3 cache: 16384K
NUMA node0 CPU(s): 0-15
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm invpcid_single ssbd ibrs ibpb tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt arat md_clear spec_ctrl
这就是我目前所拥有的,但似乎无法完成它。
$ lscpu | awk '/L3 cache:/{print ;next};/(M|MiB)$/{printf "%u\n", *(1024*1024);next};/(K|KiB)$/{printf "%u\n", *1024;next}'
0
32768
32768
4194304
16384K
有什么想法可以调整我的 awk 命令以使其正常工作吗?
编辑:
我的预期输出只是:
16777216
以字节为单位获取 3 级缓存 (L3):
getconf LEVEL3_CACHE_SIZE
Cyrus 的答案确实是最优的,但如果您使用 awk,试试这个:
awk -F: 'BEGIN{def=1024}/^L3/{if(~/M/){def=def*def}; printf "%u\n", *def}'
$ cat tst.awk
BEGIN {
mult["K"] = 1000
mult["KiB"] = 1024
mult["M"] = mult["K"]^2
mult["MiB"] = mult["KiB"]^2
}
sub(/^L3 cache:/,"") {
smbl = $NF
sub(/[^[:alpha:]]+/,"",smbl)
print [=10=] * mult[smbl]
}
$ awk -f tst.awk file
16384000
本质上我想要的是从lscpu中提取L3缓存的字节大小。棘手的部分是 lscpu 使用的单位在版本之间不一致,我需要的必须适用于所有版本(包括 --bytes 选项可用之前的版本)。据我所知,lscpu 将使用 K、KiB、M 或 MiB,这就是我要解析的内容。
这是 lscpu 输出的内容:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 16
On-line CPU(s) list: 0-15
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 16
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 60
Model name: Intel Core Processor (Haswell, no TSX, IBRS)
Stepping: 1
CPU MHz: 2299.998
BogoMIPS: 4599.99
Virtualization: VT-x
Hypervisor vendor: KVM
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 4096K
L3 cache: 16384K
NUMA node0 CPU(s): 0-15
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm invpcid_single ssbd ibrs ibpb tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt arat md_clear spec_ctrl
这就是我目前所拥有的,但似乎无法完成它。
$ lscpu | awk '/L3 cache:/{print ;next};/(M|MiB)$/{printf "%u\n", *(1024*1024);next};/(K|KiB)$/{printf "%u\n", *1024;next}'
0
32768
32768
4194304
16384K
有什么想法可以调整我的 awk 命令以使其正常工作吗?
编辑: 我的预期输出只是:
16777216
以字节为单位获取 3 级缓存 (L3):
getconf LEVEL3_CACHE_SIZE
Cyrus 的答案确实是最优的,但如果您使用 awk,试试这个:
awk -F: 'BEGIN{def=1024}/^L3/{if(~/M/){def=def*def}; printf "%u\n", *def}'
$ cat tst.awk
BEGIN {
mult["K"] = 1000
mult["KiB"] = 1024
mult["M"] = mult["K"]^2
mult["MiB"] = mult["KiB"]^2
}
sub(/^L3 cache:/,"") {
smbl = $NF
sub(/[^[:alpha:]]+/,"",smbl)
print [=10=] * mult[smbl]
}
$ awk -f tst.awk file
16384000