Bash sed awk,格式化 CPU/Mem 来自 /proc/cpuinfo 和 /proc/meminfo 的信息

Bash sed awk, format CPU/Mem info from /proc/cpuinfo and /proc/meminfo

我试图解决的问题是生成可移植的输出,我可以在我们环境中的所有服务器上显示这些输出,以便在登录时使用所有 CentOS / Red Hat 系统上的通用信息显示基本信息。我想从 /proc/cpuinfo/proc/meminfo(或 free -m -h)中提取信息; “为什么不只是‘yum install some-great-tool’?”并不理想,因为所有这些信息都可以在 /proc 中免费提供给我们。我知道这种事情对于 sed/awk 专家来说通常是一个非常简单的技巧(我不知道如何处理这个 以我有限的 sed/awk 知识)。

我想在一行中提取如下内容:

<model name>, <cpu MHz> MHz, <cpu cores> cores, <detect "vmx" (Intel-VT) or "svm" (AMD-V support)>

例如使用以下输出,这看起来像(“1300.000”四舍五入为“1300”)

"AMD Athlon(tm) II Neo N36L Dual-Core Processor, 1300 MHz, 2 cores, VMX-Virtualization" (or "SVM-Virtualization" or "No Virtualization")

我还想将此信息与 /proc/meminfofree -mh 的信息合并,所以:

"AMD Athlon(tm) II Neo N36L Dual-Core Processor, 1300 MHz, 2 cores, 4.7 GB Memory (1.8 GB Free), SVM-Virtualization"

我花了一些时间寻找方法,但没有成功,也许这是一个有趣的通用问题,因为涉及采用包含大量信息的表格格式并根据需要提取,因此有一些通用应用程序.

$ free -m -h

              total        used        free      shared  buff/cache   available
Mem:          4.5Gi       1.2Gi       1.8Gi        77Mi       1.6Gi       3.0Gi
Swap:         4.8Gi          0B       4.8Gi

$ cat /proc/cpuinfo

processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 16
model           : 6
model name      : AMD Athlon(tm) II Neo N36L Dual-Core Processor
stepping        : 3
microcode       : 0x10000c8
cpu MHz         : 1300.000
cache size      : 1024 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 2
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 5
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid pni monitor cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a 3dnowprefetch osvw ibs skinit wdt nodeid_msr hw_pstate vmmcall npt lbrv svm_lock nrip_save
bugs            : tlb_mmatch apic_c1e fxsave_leak sysret_ss_attrs null_seg amd_e400 spectre_v1 spectre_v2
bogomips        : 2595.59
TLB size        : 1024 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 48 bits physical, 48 bits virtual
power management: ts ttp tm stc 100mhzsteps hwpstate

$ cat /proc/meminfo

MemTotal:        4771304 kB
MemFree:         1862372 kB
MemAvailable:    3195768 kB
Buffers:            2628 kB
Cached:          1542788 kB
SwapCached:            0 kB
Active:          1534572 kB
Inactive:         909316 kB
Active(anon):     917792 kB
Inactive(anon):    62468 kB
Active(file):     616780 kB
Inactive(file):   846848 kB
Unevictable:        8384 kB
Mlocked:               0 kB
SwapTotal:       5070844 kB
SwapFree:        5070844 kB
Dirty:                20 kB
Writeback:             0 kB
AnonPages:        881304 kB
Mapped:           395420 kB
Shmem:             79776 kB
KReclaimable:     152892 kB
Slab:             295508 kB
SReclaimable:     152892 kB
SUnreclaim:       142616 kB
KernelStack:        9328 kB
PageTables:        45156 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     7456496 kB
Committed_AS:    5260708 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
Percpu:             2864 kB
HardwareCorrupted:     0 kB
AnonHugePages:    417792 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      314944 kB
DirectMap2M:     4796416 kB
DirectMap1G:           0 kB

使用 /proc/cpuinfo 和 free -mh 以及 awk,搜索所需的字符串,使用 : 作为分隔的字段,相应地设置变量,将 free -mh 的输出进一步拆分到一个名为 arr based 的数组中以“ ”为分隔符。最后,使用创建的变量以所需格式打印数据。

当搜索以 flag 开头的行时,我们使用 awk 的匹配函数搜索字符串 svn 或 vmx。匹配将由不为 0 的 RSTART 变量表示,因此我们检查它以找到正在使用的虚拟化类型。由于我们一开始就设置virt为No Virtualisation,所以没有匹配会打印No Virtualisation。

  awk -F: '/^model name/ { 
                         mod= 
                        } 
         /^cpu MHz/    { 
                         mhz= 
                        } 
         /^cpu core/ {
                         core=
                     } 
         /^flags/ { 
                         virt="No Virtualisation";
                         match([=10=],"svm");
                         if (RSTART!=0) 
                                       { 
                                         virt="SVM-Virtualisation" 
                                       };
                         match([=10=],"vmx");
                         if (RSTART!=0) { 
                                         virt="VMX-Virtualisation" 
                                        } 
                  }
         /^Mem:/ {
                         split(,arr," ");
                         tot=arr[1];
                         free=arr[2]
                  } 
         END { 
                         printf "%s %dMHz %s core(s) %s %sB Memory (%sB Free)\n",mod,mhz,core,virt,tot,free 
             }' /proc/cpuinfo <(free -mh)

一个班轮:

awk -F: '/^model name/ { mod= } /^cpu MHz/ { mhz= } /^cpu core/ {core=} /^flags/ { virt="No Virtualisation";match([=11=],"svm");if (RSTART!=0) { virt="SVM-Virtualisation" };match([=11=],"vmx");if (RSTART!=0) { virt="VMX-Virtualisation" } } /^Mem:/ {split(,arr," ");tot=arr[1];free=arr[2]} END { printf "%s %dMHz %s core(s) %s %sB Memory (%sB Free)\n",mod,mhz,core,virt,tot,free }' /proc/cpuinfo <(free -mh)