はじめに
コマンドの出力結果を定期的に取得します。1ファイルに取得時間とコマンドの出力の組み合わせでファイルサイズが大きくなります。時系列での比較をするのにファイルを分割したくなるので、その方法を調べました。
コマンドの出力取得例
ネットワークの状態変化を確認するのに、netstat -an を定期的に取得します。netstat.out に10秒間隔で出力されます。
netstat
$ while true
> do
> date +"%F %T" >> netstat.out
> netstat -an >> netstat.out
> sleep 10
> done
ファイルの分割
以下が定期的に出力されることになります。
netstat.out
2018-06-19 23:50:32
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
...
以下のコマンドで日付の部分を先頭にして分割することができます。
- -z .. 0 バイトのファイルができてしまったので指定しました。
- -f .. netstat を prefixにして分割ファイルを出力
- -n 3 .. suffix に使う数字の桁数 3 だと 000 から 999 まで、出来上がるファイル数で指定しておく。
今回の場合だと grep "2018-06" netstat.out | wc -l で数を数えてから指定しました。
csplit
$ grep "2018-06" netstat.out | wc -l
41
$ csplit -z -f netstat -n 3 netstat.out /2018-06/ {*}
最初は grep で行数を確認して、この行数をもとに head と tail で取り出せないかと試行錯誤しまうところでしたが、探してみると見つかるもんですね。
grep
$ cat -n netstat.out | grep 2018-06
1 2018-06-19 23:50:32
852 2018-06-19 23:50:42
1703 2018-06-19 23:50:52
2554 2018-06-19 23:51:02
3405 2018-06-19 23:51:12
4256 2018-06-19 23:51:22
5107 2018-06-19 23:51:32
5958 2018-06-19 23:51:42
6815 2018-06-19 23:51:52
7672 2018-06-19 23:52:02
8529 2018-06-19 23:52:12