AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79467673
Accepted
dasunsrule32
dasunsrule32
Asked: 2025-02-26 03:24:17 +0800 CST2025-02-26 03:24:17 +0800 CST 2025-02-26 03:24:17 +0800 CST

使用 awk 获取 PCI 地址

  • 772

我正在编写一行代码来从 Incus 获取 GPU 的 PCI 地址。以下是该命令第一部分的输出:

incus info --resources | grep -E 'GPU:|GPUs:' -A 20
GPUs:
  Card 0:
    NUMA node: 0
    Vendor: ASPEED Technology, Inc. (1a03)
    Product: ASPEED Graphics Family (2000)
    PCI address: 0000:22:00.0
    Driver: ast (6.12.9-production+truenas)
    DRM:
      ID: 0
      Card: card0 (226:0)
      Control: controlD64 (226:0)
  Card 1:
    NUMA node: 0
    Vendor: NVIDIA Corporation (10de)
    Product: GP102 [GeForce GTX 1080 Ti] (1b06)
    PCI address: 0000:2b:00.0
    Driver: nvidia (550.142)
    DRM:
      ID: 1
      Card: card1 (226:1)
      Render: renderD128 (226:128)
    NVIDIA information:
      Architecture: 6.1
      Brand: GeForce
      Model: NVIDIA GeForce GTX 1080 Ti
      CUDA Version: 12.4
      NVRM Version: 550.142
      UUID: GPU-9d45b825-9a28-afab-1189-e071779f7469

我使用grep将其限制为'amd|intel|nvidia',awk打印PCI Address:,然后sed删除空格。我一直得到一个尾随的哈希(#)字符,它实际上是从 生成的printf。printf会自动为我删除所有额外的字符newlines。但是,我还没有找到一种方法来消除哈希字符。我在这里遗漏了什么?如果有更好的方法,我也会接受。谢谢!

incus info --resources | grep -E 'GPU:|GPUs:' -A 20 | grep -Ei 'amd|intel|nvidia' -A 20 | awk -F "PCI address:" '{printf $2}' | sed 's/ //'
0000:2b:00.0#

编辑:简而言之,为了增加一些清晰度,我只需要从、或PCI Address:之一中获取并输出 PCI 地址:仅。amdintelnvidia

awk
  • 5 5 个回答
  • 79 Views

5 个回答

  • Voted
  1. Best Answer
    Ed Morton
    2025-02-26T05:23:49+08:002025-02-26T05:23:49+08:00

    这可能是您要尝试做的事情,使用任何 POSIX awk:

    $ awk '
        /^[^[:space:]]/ { g = (/GPUs?:/) }
        /Vendor:/ { v = (tolower($0) ~ /amd|intel|nvidia/) }
        g && v && sub(/.*PCI address: /,"")
    ' file
    0000:2b:00.0
    

    您不需要| grep -E 'GPU:|GPUs:' -A 20,也不需要调用sed或任何其他工具。如果上述内容不能完全满足您的要求,请编辑您的问题以澄清您的要求和/或提供更具代表性的样本输入/输出。

    顺便说一句,关于printf $2问题中的 OP 代码 - 只有printf $2当您有一个非常具体和极不寻常的需求将输入解释为 printf 格式字符串时才这样做(对于任何输入字符串),否则使用,printf "%s", $2这样当输入包含 printf 格式字符串时它就不会失败,比如%s。

    • 2
  2. markp-fuso
    2025-02-26T05:11:55+08:002025-02-26T05:11:55+08:00

    为了模拟 OP 的incus输出,同时在开始/结束处添加几行:

    $ cat incus.out
    Not this section:
        Vendor: Intel
        PCI Address: not this address
    GPUs:
      Card 0:
        NUMA node: 0
        Vendor: ASPEED Technology, Inc. (1a03)
        Product: ASPEED Graphics Family (2000)
        PCI address: 0000:22:00.0
        Driver: ast (6.12.9-production+truenas)
        DRM:
          ID: 0
          Card: card0 (226:0)
          Control: controlD64 (226:0)
      Card 1:
        NUMA node: 0
        Vendor: NVIDIA Corporation (10de)
        Product: GP102 [GeForce GTX 1080 Ti] (1b06)
        PCI address: 0000:2b:00.0
        Driver: nvidia (550.142)
        DRM:
          ID: 1
          Card: card1 (226:1)
          Render: renderD128 (226:128)
        NVIDIA information:
          Architecture: 6.1
          Brand: GeForce
          Model: NVIDIA GeForce GTX 1080 Ti
          CUDA Version: 12.4
          NVRM Version: 550.142
          UUID: GPU-9d45b825-9a28-afab-1189-e071779f7469
    Not this section:
        Vendor: AMD
        PCI Address: again, not this address
    

    一个awk想法:

    $ cat incus.awk
    BEGIN          { n=split(inlist,arr,",")            # split input variable "inlist" on commas and store in array arr[]
                     for (i=1;i<=n;i++)                 # loop through array to build ...
                         vendors[tolower(arr[i])]       # associative array of lowercase vendors
                   }
    
    gflag &&                                            # if gpu flag is set and ...
    vflag &&                                            # if vendor flag is set and ...
    /PCI address:/ { print $NF; gflag = vflag = 0 }     # line contains string "PCI address:" then print last field and clear flags
    
    gflag &&                                            # if gpu flag is set and ...
    /Vendor:/      { for (vendor in vendors)            # line contains string "Vendor:" then loop through vendors ...
                         if (tolower($0) ~ vendor)      # looking for match and if we find one then ...
                            vflag = 1                   # set vendor flag
                   }
    
    /GPUs:/        { gflag = 1; vflag = 0 }             # if line contains string "GPUs:" then set gpu flag and clear vendor flag
    

    注意:awk此脚本依赖于操作员在变量中提供以逗号分隔的供应商列表inlist

    进行试驾:

    $ cat incus.out | awk -v inlist='amd,intel,nvidia' -f incus.awk
    0000:2b:00.0
    
    • 1
  3. Pedro Maimere
    2025-02-26T11:45:23+08:002025-02-26T11:45:23+08:00

    尝试一下这段使用记录范围模式的代码。

    incus info --resources | awk '/^GPUs:/,!/^GPUs:|[^[:blank:]]/ { if(/Vendor/ && (tolower($0)~/amd|intel|nvidia/)) vendor = 1; if(/PCI address:/ && vendor) { printf $3; vendor=0 } }'
    

    注意:如果有两个来自 amd、nvidia 或 intel 的 GPU,printf则会将两个结果连接起来打印。

    • 0
  4. potong
    2025-02-26T15:49:21+08:002025-02-26T15:49:21+08:00

    这可能对你有用(GNU sed):

    sed -nE '/^\S/{h;d}
             x;/^GPUs?:/ba;x;d
             :a;x;/^\s*Vendor:/{x;s/\n.*//;x;H;d}
             x;/^GPUs?:\n\s*Vendor:.*(amd|intel|nvidia)/Ibb;x;d
             :b;x;s/.*PCI address: //p' file
    

    如果某一行包含 ,PCI address: 则打印该行的其余部分当且仅当该行之前的行也包含字符串GPUs:并且Vendor:供应商为amd、intel或nvidia。

    • 0
  5. Daweo
    2025-02-26T16:33:57+08:002025-02-26T16:33:57+08:00

    printf会自动为我删除所有额外的换行符。

    不,printf不会这样做,当 GNUAWK将文件拆分为记录时,换行符会被删除(假设RS您使用的是 default )。可以使用index字符串函数检查

    echo 'PCI address: some' | awk -F "PCI address:" '{print index($2,"\n")}'
    

    给出输出

    0
    

    这意味着未找到,$2即在输入之前不包含任何换行符printf。

    awk -F "PCI address:" '{printf $2}'
    

    请注意,如果你使用printf这种方式,你必须保证里面不会有任何格式字符串$2,否则代码将会出现故障,例如

    echo 'PCI address: %d' | awk -F "PCI address:" '{printf $2}'
    

    将导致致命的:没有足够的参数来满足格式字符串以避免该问题设置ORS(输出行分隔符)为空字符串并print使用

    echo 'PCI address: %d' | awk -F "PCI address:" 'BEGIN{ORS=""}{print $2}'
    

    然后 sed 删除空格

    这不是对sed 's/ //'所做操作的准确描述。它确实会从每行中删除第一个空格字符(如果有),否则不执行任何操作。如果您希望指示 GNUsed从每行中删除所有空格字符,请执行

    command | sed 's/[[:space:]]//g'
    

    其中[:space:]是命名的字符类并g通知 GNU全局sed进行更改

    还没有找到办法消除哈希字符

    这是tr指挥部的任务

    echo "0000:2b:00.0#" | tr -d '#'
    

    给出输出

    0000:2b:00.0
    

    请注意,trGNU coreutilssed支持字符类,因此如果您有 GNU coreutils ,您可以使用它代替上面给出的命令tr,如下所示

    command | tr -d '[:space:]'
    

    如果有更好的方法,我也会接受

    大多数情况下,如果您的管道由awk和grep和组成sed,则应该能够将其替换为单个awk。我不会这样做,因为其他人已经提供了awk仅 的解决方案。

    • 0

相关问题

  • 当只使用一个打印命令时,awk 打印行两次

  • 解析列值

  • Gnuplot 日期限制(2038?)

  • awk 命令获取具有多列的文件中的唯一行

  • 将文件每一行的后半部分替换为另一个文件中相应行的后半部分[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve