重新格式化Linux命令输出

时间:2017-01-22 07:41:01

标签: linux shell

运行以下命令:

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

2 个答案:

答案 0 :(得分:1)

使用AWK

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/在当前记录(行)与相应的正则表达式匹配时执行大括号中的块。这些值会收集到ms个变量中。在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 }'

使用Perl

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)

您可以通过这种方式定制两个grepcut,并与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