Essentially what I want is to extract the byte size of the L3 cache from lscpu. The tricky part is that the units lscpu uses is not consistent across versions and what I need has to work with all versions (including the versions before the –bytes option was available). lscpu from what I can see will either use K, KiB, M or MiB so that is what I’m trying to parse.
Here is what lscpu outputs:
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
And this is what I have so far but can’t seem to finish it off.
$ lscpu | awk '/L3 cache:/{print $3$4;next};/(M|MiB)$/{printf "%un", $3*(1024*1024);next};/(K|KiB)$/{printf "%un", $3*1024;next}' 0 32768 32768 4194304 16384K
Any ideas how to tweak my awk command to get this working?
Edit: My expected output would just be:
16777216
Advertisement
Answer
Really Cyrus’ answer is the optimal, but if you’re set on awk, try this:
awk -F: 'BEGIN{def=1024}/^L3/{if($2~/M/){def=def*def}; printf "%un", $2*def}'