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/meminfo
或 free -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)
我试图解决的问题是生成可移植的输出,我可以在我们环境中的所有服务器上显示这些输出,以便在登录时使用所有 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/meminfo
或 free -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)