我有包含以下内容的文件:
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)
解释:
- 在包含 的行上
:
,它将下一行附加到当前记录。 - 然后从原始行的换行符删除直到最后一行
(
,并将其替换为(
并打印记录。 - 由于
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)