正则表达式格式化文件输出

正则表达式格式化文件输出

我有包含以下内容的文件:

   foo-6-25.example.com:
         1  Var. Speed   System Board    Normal     Yes     Normal   ( 49)
    --
    foo-5-4.example.com:
         1  Var. Speed   System Board    Normal     Yes     Normal   ( 19)
    --
    foo-8-28.example.com:
         1  Var. Speed   System Board    Normal     Yes     Normal   ( 43)
    --
    foo-9-7.example.com:
         1  Var. Speed   System Board    Normal     Yes     Normal   ( 91)
    --
    foo-5-19.idmz.example.com:
         1  Var. Speed   System Board    Normal     Yes     Normal   ( 19)
    --
    foo-7-3.example.com:
         1  Var. Speed   System Board    Normal     Yes     Normal   ( 20)

我想按以下方式对其进行格式化:服务器名称,然后是()括号内的风扇速度

foo-6-25.example.com: ( 49)
foo-5-4.example.com:  ( 19)

不知道如何使用 awk 或任何其他工具来使用它。

答案1

awk解决方案

$ awk '/:/{d=$1}/Speed/{printf"%-28s%s\n",d,substr($0,length($0)-4)}' file
foo-6-25.example.com:       ( 49)
foo-5-4.example.com:        ( 19)
foo-8-28.example.com:       ( 43)
foo-9-7.example.com:        ( 91)
foo-5-19.idmz.example.com:  ( 19)
foo-7-3.example.com:        ( 20)
$

awk+column解决方案

动态对齐列。

$ awk '/:/{d=$1}/Speed/{print d,substr($0,length($0)-4)}' file|column -to' '
foo-6-25.example.com:       ( 49)
foo-5-4.example.com:        ( 19)
foo-8-28.example.com:       ( 43)
foo-9-7.example.com:        ( 91)
foo-5-19.idmz.example.com:  ( 19)
foo-7-3.example.com:        ( 20)
$

答案2

$ sed -e '/--/d;N;s/\n/ /;s/[[:blank:]]\+//;s/[[:blank:]]\+[^(]\+/, /' file | column -ts ','
foo-6-25.example.com:        ( 49)
foo-5-4.example.com:         ( 19)
foo-8-28.example.com:        ( 43)
foo-9-7.example.com:         ( 91)
foo-5-19.idmz.example.com:   ( 19)
foo-7-3.example.com:         ( 20)

如果您不希望第二列有任何间距/对齐,您可以省略该column命令:

$ sed -e '/--/d;N;s/\n/ /;s/[[:blank:]]\+//;s/[[:blank:]]\+[^(]\+/ /' file
foo-6-25.example.com: ( 49)
foo-5-4.example.com: ( 19)
foo-8-28.example.com: ( 43)
foo-9-7.example.com: ( 91)
foo-5-19.idmz.example.com: ( 19)
foo-7-3.example.com: ( 20)

如果您正在使用 GNU,sed您可以进一步减少它:

$ sed -e '/--/d;N;s/\n/ /;s/[ ]\+//;s/[ ]\+[^(]\+/ /' file

答案3

% perl -ne 'print(($_ .= <>) =~ s/\n.*\(/ (/r) if /:/' input.file

输出:

foo-6-25.example.com: ( 49)
foo-5-4.example.com: ( 19)
foo-8-28.example.com: ( 43)
foo-9-7.example.com: ( 91)
foo-5-19.idmz.example.com: ( 19)
foo-7-3.example.com: ( 20)

解释:

  1. 在包含 的行上:,它将下一行附加到当前记录。
  2. 然后从原始行的换行符删除直到最后一行(,并将其替换为( 并打印记录。
  3. 由于perl是用 调用的-n,因此不会打印不受影响的记录。

Sed有一种非常紧凑的方式来编写相同的内容:

sed -ne '/:/N;s/\n.*(/ (/p' input.file

答案4

使用 awk 中段落模式

awk -vRS='\n[ \t]*--' '
  match($0, /\( *[0-9]+\)/) {print $1, substr($0,RSTART,RLENGTH)}
' file
foo-6-25.example.com: ( 49)
foo-5-4.example.com: ( 19)
foo-8-28.example.com: ( 43)
foo-9-7.example.com: ( 91)
foo-5-19.idmz.example.com: ( 19)
foo-7-3.example.com: ( 20)

相关内容