そんな感じの処理について見かけたので、一応備忘で残しておく。 例えば、以下のようなvmstatの出力をカンマ区切りの表に切り替えたいとする。
[root@BS-PUB-CENT7-01 ~]# vmstat 1 10 | tail -n+2
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 1291364 1812 500100 0 0 0 0 9 14 0 0 100 0 0
0 0 0 1291364 1812 500100 0 0 0 0 16 19 0 0 100 0 0
0 0 0 1291324 1812 500100 0 0 0 0 11 17 0 0 100 0 0
0 0 0 1291324 1812 500100 0 0 0 0 13 20 0 0 100 0 0
0 0 0 1291324 1812 500100 0 0 0 0 19 26 0 1 99 0 0
0 0 0 1291324 1812 500100 0 0 0 0 12 14 0 0 100 0 0
0 0 0 1291324 1812 500100 0 0 0 0 14 17 0 0 100 0 0
0 0 0 1291324 1812 500100 0 0 0 0 12 15 0 0 100 0 0
0 0 0 1291324 1812 500100 0 0 0 0 12 16 0 0 100 0 0
0 0 0 1291324 1812 500100 0 0 0 0 13 11 0 0 100 0 0
そんな時、単純にスペース(正規表現だと\s+で連続スペース)をカンマに変換するだけだと、行頭のスペースもカンマに変換されてしまうため、そこについても別に置換が必要となる。 それが面倒であれば、(リアルタイムで出力されるような処理でなければ)以下のようにcolumnコマンドで、sed等で扱いやすい形式に扱いスペース区切りの表に変換し、そこからsedで置換をすると楽だ。
[root@BS-PUB-CENT7-01 ~]# vmstat 1 10 | tail -n+2 > ./test.vmstat
[root@BS-PUB-CENT7-01 ~]# cat test.vmstat
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 1291432 1812 500100 0 0 0 0 9 14 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 19 24 0 1 99 0 0
0 0 0 1291400 1812 500100 0 0 0 3 12 23 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 18 23 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 7 11 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 13 15 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 8 11 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 13 16 1 0 99 0 0
0 0 0 1291400 1812 500100 0 0 0 0 13 25 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 12 20 0 0 100 0 0
[root@BS-PUB-CENT7-01 ~]# cat test.vmstat | column -t
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 1291432 1812 500100 0 0 0 0 9 14 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 19 24 0 1 99 0 0
0 0 0 1291400 1812 500100 0 0 0 3 12 23 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 18 23 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 7 11 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 13 15 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 8 11 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 13 16 1 0 99 0 0
0 0 0 1291400 1812 500100 0 0 0 0 13 25 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 12 20 0 0 100 0 0
[root@BS-PUB-CENT7-01 ~]# cat test.vmstat | column -t | sed -r 's/\s+/,/g'
r,b,swpd,free,buff,cache,si,so,bi,bo,in,cs,us,sy,id,wa,st
2,0,0,1291432,1812,500100,0,0,0,0,9,14,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,19,24,0,1,99,0,0
0,0,0,1291400,1812,500100,0,0,0,3,12,23,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,18,23,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,7,11,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,13,15,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,8,11,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,13,16,1,0,99,0,0
0,0,0,1291400,1812,500100,0,0,0,0,13,25,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,12,20,0,0,100,0,0
もしくは、awkを使って処理をしたい場合は以下のようにOFS(awkが出力する際のセパレータ)を指定して以下のように出力させてやればいい。
awk '{$1=$1}1' OFS=","
[root@BS-PUB-CENT7-01 ~]# cat test.vmstat | awk '{$1=$1}1' OFS=","
r,b,swpd,free,buff,cache,si,so,bi,bo,in,cs,us,sy,id,wa,st
2,0,0,1291432,1812,500100,0,0,0,0,9,14,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,19,24,0,1,99,0,0
0,0,0,1291400,1812,500100,0,0,0,3,12,23,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,18,23,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,7,11,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,13,15,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,8,11,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,13,16,1,0,99,0,0
0,0,0,1291400,1812,500100,0,0,0,0,13,25,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,12,20,0,0,100,0,0
ちなみに、awkであればtail -Fやvmstatの出力をリアルタイムでカンマ区切りに変換させることが可能だ(あまり使う機会は無いと思うけど)。
Command | awk '{$1=$1;fflush()}1' OFS=","
[root@BS-PUB-CENT7-01 ~]# vmstat -n 1 | awk '{$1=$1;fflush()}1' OFS=","
procs,-----------memory----------,---swap--,-----io----,-system--,------cpu-----
r,b,swpd,free,buff,cache,si,so,bi,bo,in,cs,us,sy,id,wa,st
2,0,0,1291200,1812,500164,0,0,0,0,9,14,0,0,100,0,0
0,0,0,1291200,1812,500164,0,0,0,0,34,62,0,0,100,0,0
0,0,0,1291200,1812,500164,0,0,0,0,39,68,0,0,100,0,0
0,0,0,1291200,1812,500164,0,0,0,0,30,52,0,0,100,0,0
0,0,0,1291200,1812,500164,0,0,0,0,34,60,0,0,100,0,0
もし逆のパターン(カンマ区切りの表をスペース区切りで、かつテーブル状に見やすく表示したい)といった場合であれば、普通にcolumnに-s(セパレータ)でカンマを指定して-tオプションを付与してやればいい。 csvtoolsあたりを使うのも一つだろう。
[root@BS-PUB-CENT7-01 ~]# cat test.vmstat | awk '{$1=$1}1' OFS=","
r,b,swpd,free,buff,cache,si,so,bi,bo,in,cs,us,sy,id,wa,st
2,0,0,1291432,1812,500100,0,0,0,0,9,14,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,19,24,0,1,99,0,0
0,0,0,1291400,1812,500100,0,0,0,3,12,23,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,18,23,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,7,11,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,13,15,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,8,11,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,13,16,1,0,99,0,0
0,0,0,1291400,1812,500100,0,0,0,0,13,25,0,0,100,0,0
0,0,0,1291400,1812,500100,0,0,0,0,12,20,0,0,100,0,0
[root@BS-PUB-CENT7-01 ~]# cat test.vmstat | awk '{$1=$1}1' OFS="," | column -s, -t
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 1291432 1812 500100 0 0 0 0 9 14 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 19 24 0 1 99 0 0
0 0 0 1291400 1812 500100 0 0 0 3 12 23 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 18 23 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 7 11 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 13 15 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 8 11 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 13 16 1 0 99 0 0
0 0 0 1291400 1812 500100 0 0 0 0 13 25 0 0 100 0 0
0 0 0 1291400 1812 500100 0 0 0 0 12 20 0 0 100 0 0