我正在编写一行代码来从 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 地址:仅。amd
intel
nvidia
这可能是您要尝试做的事情,使用任何 POSIX awk:
您不需要
| grep -E 'GPU:|GPUs:' -A 20
,也不需要调用sed
或任何其他工具。如果上述内容不能完全满足您的要求,请编辑您的问题以澄清您的要求和/或提供更具代表性的样本输入/输出。顺便说一句,关于
printf $2
问题中的 OP 代码 - 只有printf $2
当您有一个非常具体和极不寻常的需求将输入解释为 printf 格式字符串时才这样做(对于任何输入字符串),否则使用,printf "%s", $2
这样当输入包含 printf 格式字符串时它就不会失败,比如%s
。为了模拟 OP 的
incus
输出,同时在开始/结束处添加几行:一个
awk
想法:注意:
awk
此脚本依赖于操作员在变量中提供以逗号分隔的供应商列表inlist
进行试驾:
尝试一下这段使用记录范围模式的代码。
注意:如果有两个来自 amd、nvidia 或 intel 的 GPU,
printf
则会将两个结果连接起来打印。这可能对你有用(GNU sed):
如果某一行包含 ,
PCI address:
则打印该行的其余部分当且仅当该行之前的行也包含字符串GPUs:
并且Vendor:
供应商为amd
、intel
或nvidia
。不,
printf
不会这样做,当 GNUAWK
将文件拆分为记录时,换行符会被删除(假设RS
您使用的是 default )。可以使用index
字符串函数检查给出输出
这意味着未找到,
$2
即在输入之前不包含任何换行符printf
。请注意,如果你使用
printf
这种方式,你必须保证里面不会有任何格式字符串$2
,否则代码将会出现故障,例如将导致致命的:没有足够的参数来满足格式字符串以避免该问题设置
ORS
(输出行分隔符)为空字符串并print
使用这不是对
sed 's/ //'
所做操作的准确描述。它确实会从每行中删除第一个空格字符(如果有),否则不执行任何操作。如果您希望指示 GNUsed
从每行中删除所有空格字符,请执行其中
[:space:]
是命名的字符类并g
通知 GNU全局sed
进行更改这是
tr
指挥部的任务给出输出
请注意,
tr
GNU coreutilssed
支持字符类,因此如果您有 GNU coreutils ,您可以使用它代替上面给出的命令tr
,如下所示大多数情况下,如果您的管道由
awk
和grep
和组成sed
,则应该能够将其替换为单个awk
。我不会这样做,因为其他人已经提供了awk
仅 的解决方案。