Awk 格式化dmidecode的特定输出
我正在寻找一种方法来格式化dmi的输出,并以一种特定的方式进行解码,我发现下面的文章正好满足了我的需要 我修改了上面答案中代码中需要的一些字段,这显示了awk从dmidecode创建带有引号的csv输出Awk 格式化dmidecode的特定输出,awk,Awk,我正在寻找一种方法来格式化dmi的输出,并以一种特定的方式进行解码,我发现下面的文章正好满足了我的需要 我修改了上面答案中代码中需要的一些字段,这显示了awk从dmidecode创建带有引号的csv输出 dmidecode -t 17 | awk -F: '/Size|Locator|Speed|Manufacturer|Serial Number|Part Number/{sub(/^ */,"",$2);s=sprintf("%s,\"%s\"",s,$2)}/^Memory/{print
dmidecode -t 17 | awk -F: '/Size|Locator|Speed|Manufacturer|Serial Number|Part Number/{sub(/^ */,"",$2);s=sprintf("%s,\"%s\"",s,$2)}/^Memory/{print s;s=""}END{print s}' |sed -e 's/,//' | grep -iv "no module" | tr -d ' '
"4096MB","CPU0","DIMM01","1066MHz","Samsung","754C2C33","M393B5273CH0-YH9"
我需要标签,没有报价
4096MB CPU0 DIMM01 1066MHz Samsung 754C2C33 M393B5273CH0-YH9
我仍在努力了解awk,如果有人给我看合适的修改,我将不胜感激
修复了上面的代码,以前粘贴的非工作语法从您发布的链接,我将数据保存在一个名为
file.txt的文件中。我注意到记录是以空行分隔的。我使用了以下awk
代码:
awk 'BEGIN { FS=":"; OFS="\t" } /Size|Locator|Speed|Manufacturer|Serial Number|Part Number/ { gsub(/^[ \t]+/,"",$2); line = (line ? line OFS : "") $2 } /^$/ { print line; line="" }' file.txt
结果:
2048 MB XMM1 Not Specified 1333 MHz JEDEC ID 8106812F HMT125U6BFR8C-H9
No Module Installed XMM2 Not Specified Unknown JEDEC ID
2048 MB XMM3 Not Specified 1333 MHz JEDEC ID 7006C12F HMT125U6BFR8C-H9
No Module Installed XMM4 Not Specified Unknown JEDEC ID
4096 kB SYSTEM ROM Not Specified Unknown Not Specified Not Specified Not Specified
现在,您的命令行如下所示:
dmidecode -t 17 | awk 'BEGIN { FS=":"; OFS="\t" } /Size|Locator|Speed|Manufacturer|Serial Number|Part Number/ { gsub(/^[ \t]+/,"",$2); line = (line ? line OFS : "") $2 } /^$/ { print line; line="" }' | grep -iv "no module"
编辑:
dmidecode -t 17 | awk 'BEGIN { FS=":"; OFS="\t" } /Size|Locator|Speed|Manufacturer|Serial Number|Part Number/ { if ($2 ~ /MB$|MHz$/) { gsub(/[ \t]+/,"",$2) } gsub(/^[ \t]+/,"",$2); line = (line ? line OFS : "") $2 } /^$/ { print line; line="" }' | grep -iv "no module"
从您发布的链接中,我将数据保存在一个名为file.txt
的文件中。我注意到记录是以空行分隔的。我使用了以下awk
代码:
awk 'BEGIN { FS=":"; OFS="\t" } /Size|Locator|Speed|Manufacturer|Serial Number|Part Number/ { gsub(/^[ \t]+/,"",$2); line = (line ? line OFS : "") $2 } /^$/ { print line; line="" }' file.txt
结果:
2048 MB XMM1 Not Specified 1333 MHz JEDEC ID 8106812F HMT125U6BFR8C-H9
No Module Installed XMM2 Not Specified Unknown JEDEC ID
2048 MB XMM3 Not Specified 1333 MHz JEDEC ID 7006C12F HMT125U6BFR8C-H9
No Module Installed XMM4 Not Specified Unknown JEDEC ID
4096 kB SYSTEM ROM Not Specified Unknown Not Specified Not Specified Not Specified
现在,您的命令行如下所示:
dmidecode -t 17 | awk 'BEGIN { FS=":"; OFS="\t" } /Size|Locator|Speed|Manufacturer|Serial Number|Part Number/ { gsub(/^[ \t]+/,"",$2); line = (line ? line OFS : "") $2 } /^$/ { print line; line="" }' | grep -iv "no module"
编辑:
dmidecode -t 17 | awk 'BEGIN { FS=":"; OFS="\t" } /Size|Locator|Speed|Manufacturer|Serial Number|Part Number/ { if ($2 ~ /MB$|MHz$/) { gsub(/[ \t]+/,"",$2) } gsub(/^[ \t]+/,"",$2); line = (line ? line OFS : "") $2 } /^$/ { print line; line="" }' | grep -iv "no module"
我甚至只需要一个分隔字段的空格就可以了,但我的调整未能找到对上述语法的正确修改…您能在您的系统上发布dmidecode-t17
的输出吗?快速修复方法是将s=sprintf(“%s,\“%s\”,s,$2)
更改为s=sprintf(“%s\t%s”,s,$2)
。但它仍然很难看。我甚至只需要一个分隔字段的空格就可以了,但我的调整未能找到对上述语法的正确修改…你能在你的系统上发布dmidecode-t17
的输出吗?快速修复方法是将s=sprintf(“%s,\“%s\”,s,$2)
更改为s=sprintf(“%s\t%s”,s,$2)
。但是它仍然很难看。谢谢史蒂夫,这几乎做到了,除了MB和MHz与它们的值分离。我可以在事后用sed解决这个问题,我们可以在同一个awk命令内完成吗?@user1629011:很高兴这有帮助。删除分隔值的空格的快速方法是将gsub(/^[\t]+/,“”,$2)
更改为gsub(/[\t]+/,“”,$2)
。请注意,这将影响该行上的所有值。否则,请查看我的编辑。我添加了一个if
语句来只纠正MB和MHz的分离。这可能是你正在寻找的。是否有一种更优雅的方式来摆脱在输出开始时出现的空白行,除了添加<代码>“SED//$/D”< /代码>?谢谢史提夫,这几乎是这样做的,除了MB和MHz与它们的值分离。我可以在事后用sed解决这个问题,我们可以在同一个awk命令内完成吗?@user1629011:很高兴这有帮助。删除分隔值的空格的快速方法是将gsub(/^[\t]+/,“”,$2)
更改为gsub(/[\t]+/,“”,$2)
。请注意,这将影响该行上的所有值。否则,请查看我的编辑。我添加了一个if
语句来只纠正MB和MHz的分离。这可能是你正在寻找的。是否有一种更优雅的方式来摆脱在输出开始时出现的空行,而不是添加<代码>“SED/^ $/d”< /C>?