运行以下命令:
root@kbl1infn1 # hpasmcli -s "show dimm" | egrep "Module|Status"
将产生:
Module #: 1
Status: Ok
Module #: 3
Status: Ok
Module #: 6
Status: Ok
Module #: 8
Status: Ok
Module #: 1
Status: Ok
Module #: 3
Status: Ok
Module #: 6
Status: Ok
Module #: 8
Status: Ok
如何将输出重新格式化为:
Module: 1 3 6 8 ...
Status: OK OK OK OK
答案 0 :(得分:1)
hpasmcli -s "show dimm" | awk '
/^Module/ { m = m sprintf("%4s", $3) }
/^Status/ { s = s sprintf("%4s", $2) }
END { print "Module:" m "\n" "Status:" s }'
示例输出:
Module: 1 3 6 8 1 3 6 8
Status: Ok Ok Ok Ok Ok Ok Ok Ok
当正则表达式/^Module/
和/^Status/
在当前记录(行)与相应的正则表达式匹配时执行大括号中的块。这些值会收集到m
和s
个变量中。在END
处,两个变量都打印到标准输出。
sprintf
函数返回填充到指定宽度(4)的字符串。
或者,使用-F:
选项用冒号分割记录。但是,您需要使用gsub
函数修剪值,例如:
hpasmcli -s "show dimm" | awk -F: '
/^Module/ { gsub(/ +/, "", $2); m = m sprintf("%4s", $2) }
/^Status/ { gsub(/ +/, "", $2); s = s sprintf("%4s", $2) }
END { print "Module:" m "\n" "Status:" s }'
hpasmcli -s "show dimm" | perl -e '
while (<>) {
push @m, m/:\s*(\S+)$/ if /^Module/;
push @s, m/:\s*(\S+)$/ if /^Status/;
}
print "Module: ", join("", map { sprintf "%4s", $_ } @m), "\n";
print "Status: ", join("", map { sprintf "%4s", $_ } @s), "\n";'
while
循环逐行读取输入。如果一行以&#34; Module&#34;开头,则使用m/:\s*(\S+)$/
表达式从该行中提取该值。匹配的非空格字符组(\S+)
将添加到@m
或@s
数组中。最后,数组项被连接并打印到标准输出。
答案 1 :(得分:0)
您可以通过这种方式定制两个grep
和cut
,并与printf
结合使用以格式化echo
以连接值:
echo -e "Module: $(printf %5d $(hpasmcli -s "show dimm" | grep Module | cut -f2 -d:))\nStatus: $(printf %5s $(hpasmcli -s "show dimm" |grep Status | cut -f2 -d:))"
如果您想拨打hpasmcli
一次,那么:
hpasmcli -s "show dimm" > outfile
echo -e "Module: $(printf %5d $(grep Module outfile | cut -f2 -d:))\nStatus: $(printf %5s $(grep Status outfile | cut -f2 -d:))"
输出:
Module: 1 3 6 8 1 3 6 8
Status: Ok Ok Ok Ok Ok Ok Ok Ok