Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk 格式化dmidecode的特定输出_Awk - Fatal编程技术网

Awk 格式化dmidecode的特定输出

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

我正在寻找一种方法来格式化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 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>?