次の内容を含むファイルがあります。
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)
2番目の列に間隔/並べ替えを適用したくない場合は、次の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)