Linux/UNIXでスペース区切りの表(vmstatの出力等)をカンマ区切りに変換する

そんな感じの処理について見かけたので、一応備忘で残しておく。
例えば、以下のような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
Sponsored Links

もしくは、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

 


Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。

*