regex - 使用脚本提取 Ubuntu 传感器命令

标签 regex bash ubuntu awk

这个问题是 Extracting and Processing GPUTemperature Information Using Regexp 的延续

基本上,我想使用传感器命令和 gawk 和 bash 等脚本来提取 GPU 温度信息。

传感器输出示例如下:

amdgpu-pci-0c00
Adapter: PCI adapter
fan1:        1972 RPM
temp1:        +50.0°C  (crit =  +0.0°C, hyst =  +0.0°C)

amdgpu-pci-0600
Adapter: PCI adapter
fan1:        1960 RPM
temp1:        +47.0°C  (crit =  +0.0°C, hyst =  +0.0°C)

amdgpu-pci-0200
Adapter: PCI adapter
fan1:        1967 RPM
temp1:        +52.0°C  (crit =  +0.0°C, hyst =  +0.0°C)

pch_skylake-virtual-0
Adapter: Virtual device
temp1:        +33.0°C

amdgpu-pci-0900
Adapter: PCI adapter
fan1:        1893 RPM
temp1:        +51.0°C  (crit =  +0.0°C, hyst =  +0.0°C)

amdgpu-pci-0300
Adapter: PCI adapter
fan1:        1992 RPM
temp1:        +53.0°C  (crit =  +0.0°C, hyst =  +0.0°C)

coretemp-isa-0000
Adapter: ISA adapter
Package id 0:  +24.0°C  (high = +80.0°C, crit = +100.0°C)
Core 0:        +23.0°C  (high = +80.0°C, crit = +100.0°C)
Core 1:        +21.0°C  (high = +80.0°C, crit = +100.0°C)

我想根据总线 ID 的升序打印每个 GPU 的标签和温度。例如,根据前面的输出,第一个 GPU,GPU0,将是带有标签 amdgpu-pci-0200 的那个,GPU1 将是 amdgpu-pci-0300,直到最后一个 GPU4 是 amdgpu-pci-0c00。这不包括 coretemp-isa-0000,因为它不是 GPU。不管总线ID是连续的还是跳过的,我都想按升序标记它。

以下 bash 代码将在不正确排序的情况下提取所有 GPU 临时文件。
#!/bin/bash

while [ 1 ]
do
        temp=( $( sensors | IFS=$'\n' gawk 'BEGIN{ RS="\n\n"} { if($0 ~ /amdgpu/) print $0 }' | gawk 'BEGIN{ FS="[+.]" } { if($1 ~ /temp1:/) print $2 }' ))   
        let j=0
        for i in "${temp[@]}"
        do
                echo -en  "GPU $j temp is $i \r "
                j=$(($j +1))
                sleep 1
        done
done

我该如何解决?

问候

最佳答案

您没有提供实际的预期输出或提供有关如何解析输入的一些详细信息,所以这有点猜测,但它可能是您正在寻找的:

$ cat tst.sh
#!/bin/env bash

#while :
#do
    cat file |
    gawk '
        BEGIN { RS="" }
        $1 ~ /amdgpu/ {
            temp = "N/A"
            for (i=1; i<NF; i++) {
                if ($i == "temp1:") {
                    temp = gensub(/^[^0-9]*([0-9]+).*/,"\\1",1,$(i+1))
                }
            }
            temps[$1] = temp
        }
        END {
            PROCINFO["sorted_in"] = "@ind_str_asc"
            for (id in temps) {
                print "GPU" (++cnt), id, temps[id]
            }
        }
    '
    #sleep 1
#done

$ ./tst.sh
GPU1 amdgpu-pci-0200 52
GPU2 amdgpu-pci-0300 53
GPU3 amdgpu-pci-0600 47
GPU4 amdgpu-pci-0900 51
GPU5 amdgpu-pci-0c00 50

只需更改 cat filesensors并取消注释这些行以激活无限循环(假设您有这样做的理由),当您对此感到满意时。

上面将 GNU awk 用于 gensub() 和 sorted_in。

关于regex - 使用脚本提取 Ubuntu 传感器命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52606325/

相关文章:

linux - ssh2 中的特殊字符

Laravel nginx 权限问题

linux - 无法连接/dev/video0(网络摄像头),我该怎么办?

ruby - 为什么在 `/` 之后的正则表达式模式中不允许使用 `#`?

c++ - 如何解析cpprestsdk生成的多个Set-Cookie?

r - 在第一个空格上分割字符字段,而不删除 r 中的字段

linux - 在 Bash 中解析带有开始和结束定界符的字符串

linux - Bash 脚本未运行

php shell命令错误GLIBCXX_3.4.9未找到

java - 验证单词中给定字母的数量(重复和顺序并不重要)