【问题标题】:script to return info from /proc/从 /proc/ 返回信息的脚本
【发布时间】:2014-04-07 23:09:03
【问题描述】:

我正在尝试编写一个脚本,该脚本将返回来自 /proc/cpuinfo、/proc/meminfo 和 /proc/version 文件的信息。

从 cpuinfo 文件中,我想返回 cpu Mhz 和型号名称。 我可以通过这些命令得到这些

    more /proc/cpuinfo | grep "model name" | head -n 1

    more /proc/cpuinfo | grep "cpu MHz"

对于 meminfo 文件,我想获取总内存、可用内存和已用总内存。我可以通过这些命令获得前 2 个:

    more /proc/meminfo | grep MemTotal
    more /proc/meminfo | grep MemFree

我可以用这个得到 linux 版本:

    more /proc/version

然后我可以通过将第一个输出重定向到文件中将其保存为文件,然后使用>>而不是>附加下一个信息项。

我的问题是 - 我如何编写一个脚本来获取上面的信息并将其放入这种格式:

  /proc/cpuinfo, Model name: (result of first command above)
  /proc/cpuinfo, cpu Mhz:  (result of 2nd)
  /proc/meminfo, MemTotal: (result of 3rd)
  /proc/meminfo, MemFree: (result of 4th)
  /proc/meminfo, MemUsed:  (calculate it based off memtotal and memfree)
  /proc/version, Linux version #:  

我知道如何使用 cut、awk 等,但不知道如何设置。我也不知道如何强制计算使用的内存。

如果您能提供任何帮助,我们将不胜感激。

编辑:我使用 more 因为我对 Linux 不太熟悉。

结合此处发布的内容和我需要提出的内容,我越来越接近我想要做的事情。

数学函数 - 我只想取 memtotal 并从中减去 memfree。

我可以创建一个变量,例如

    memused=$(bc $memtotal - memfree)

然后回显出来?

【问题讨论】:

  • 发布样本输入和预期输出。就我个人而言,我不知道这些文件可以包含什么,但我对 awk 有所了解,也许可以提供帮助。
  • 你熟悉 Python 吗?如果是,我的文章:amitsaha.github.io/site/notes/articles/python_linux/… 可能会有所帮助。
  • 将more 传递给grep 的理由绝对为零。无用的使用 cat 已经够糟糕了,但这是一个无用的使用 more!就做grep MemTotal /proc/meminfo

标签: linux bash awk


【解决方案1】:

使用简单的 shell 函数,例如:

filedata() {
    grep -H "$@" | sed -e 's/:/, /'
}

你可以通过调用获取大部分你需要的数据

filedata 'model name' /proc/cpuinfo
filedata -E 'Mem(Total|Free)' /proc/meminfo
filedata . /proc/version

要获取 MemUsed,您可以使用以下内容:

awk '/MemFree/ {free=$2} /MemTotal/ {total=$2} END {print FILENAME",","MemUsed:", total-free}' /proc/meminfo

或者,以下 awk 脚本将为您完成所有工作(尽管不完全按照示例输出的顺序):

awk '/model name|cpu MHz|MemTotal|MemFree|^Linux/ {
    print FILENAME",",$0
}

/MemTotal|MemFree/ {
    v=$1
    gsub(/^Mem/, "", v)
    gsub(/:$/, "", v)
    mem[v]=$2
}

END {
    print "/proc/meminfo, MemUsed:", mem["Total"] - mem["Free"]
}' /proc/cpuinfo /proc/meminfo /proc/version

【讨论】:

  • 我尽量不要一下子变得过于压倒性。所以第一点是保持相同的操作“风格”,而 awk 的答案是“但你真的不需要为此做那么多工作”。
【解决方案2】:

您可以通过简化的方式执行以下操作:

示例

#!/bin/sh

LOCATION=$1

if [ "$#" -ne "1" ]
then
echo "Usage: ./$0 <FILE>"
else
model=$(cat /proc/cpuinfo |grep -m 1 "model name"|cut -d' ' -f 4-);
mhz=$(cat /proc/cpuinfo |grep -m 1 "cpu MHz"|cut -d' ' -f 3-);
mem=$(cat /proc/meminfo | grep MemTotal|cut -d' ' -f 2-);
free=$(cat /proc/meminfo | grep MemFree|cut -d' ' -f 2-);
ver=$(cat /proc/version|cut -d' ' -f 3);


fi


echo -e \
"/proc/cpuinfo, Model Name: $model
/proc/cpuinfo, CPU MHz: $mhz
/proc/meminfo, MemTotal: $mem 
/proc/meminfo, MemFree: $free 
/proc/version, Linux Verion #: $ver" > $LOCATION

这会将每个结果放入一个变量中,这样您就可以将echo 放入一个您在调用sh test.sh mynewfile.txt 之类的脚本时声明的文件中。

至于“我也不知道如何强制计算使用的mem。”请更新您的问题,以包括您希望这些值如何呈现(kb、MB、GB)以及您正在寻找的示例输出。

【讨论】:

  • 您可能想丢失useless cats。
  • @tripleee 猫并不是无用的 persay。对于不熟悉 *nix shell 的人来说,它提供了一定程度的详细程度,这对于帮助 OP 了解命令发生的情况很重要。如果没有它像英语一样阅读它(从左到右),该命令将变得不那么有意义并且更难理解。
  • 我想使用来自 MemTotal 和 MemFree 的任何 #。像这样的工作: memused=$(MemTotal-MemFree)???
【解决方案3】:

以下是仅使用 awk 获取价值的方法:

model=$(awk -F: '/model name/ {print $2;exit}' /proc/cpuinfo)
mhz=$(awk -F: '/cpu MHz/ {print $2;exit}' /proc/cpuinfo)
mem=$(awk -F"[: ]+" '/MemTotal/ {print $2;exit}' /proc/meminfo)
etc

【讨论】:

    猜你喜欢
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多