Practice of Programming

プログラム とか Linuxとかの話題

tcat という行頭に日時を付加するコマンドを作った

cat のように標準入力かファイルの中身を出力するものですが、先頭行に日時がつきます。
https://github.com/ktat/tcat にあります。

なんで、こんなものが必要かというと、例えば、サーバの様子を top -b を記録して後からみたいなーとかいう時とかに...

% top -b >> top.log

みたいにしたすると、ファイルの中身はこんな感じ。

top - 00:44:33 up 16:59,  7 users,  load average: 1.76, 1.75, 1.62
Tasks: 345 total,   1 running, 344 sleeping,   0 stopped,   0 zombie
%Cpu(s): 30.3 us, 11.1 sy,  0.0 ni, 57.9 id,  0.4 wa,  0.0 hi,  0.2 si,  0.0 st
KiB Mem : 16312908 total,   409000 free,  9663728 used,  6240180 buff/cache
KiB Swap: 16657404 total, 16655344 free,     2060 used.  4595576 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 9618 ktat      20   0   42952   3800   3140 R  12.5  0.0   0:00.03 top
 5253 ktat      20   0 1745952 424904  69868 S   6.2  2.6   6:14.04 slack
 5306 ktat      20   0 1497416 376924 181836 S   6.2  2.3  17:12.10 slack
    1 root      20   0  185412   6012   3944 S   0.0  0.0   0:04.64 systemd
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.04 kthreadd

後から見ようとした時に、どの時間のものだったのか調べようとすると....

top - 00:44:33 up 16:59,  7 users,  load average: 1.76, 1.75, 1.62

ここにあるけど、とっても使いにくいし、日またいだら、どうするんだという感じなので...

% top -b | tcat >> top.log

とすることで、

2017-01-25 00:48:25: top - 00:48:25 up 17:03,  7 users,  load average: 1.29, 1.63, 1.62
2017-01-25 00:48:25: Tasks: 341 total,   1 running, 340 sleeping,   0 stopped,   0 zombie
2017-01-25 00:48:25: %Cpu(s): 30.1 us, 11.0 sy,  0.0 ni, 58.3 id,  0.4 wa,  0.0 hi,  0.2 si,  0.0 st
2017-01-25 00:48:25: KiB Mem : 16312908 total,   582792 free,  9512076 used,  6218040 buff/cache
2017-01-25 00:48:25: KiB Swap: 16657404 total, 16655352 free,     2052 used.  4772668 avail Mem 
2017-01-25 00:48:25: 
2017-01-25 00:48:25:   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
2017-01-25 00:48:25:  9850 ktat      20   0   42952   3732   3076 R  12.5  0.0   0:00.03 top
2017-01-25 00:48:25:     1 root      20   0  185412   6012   3944 S   0.0  0.0   0:04.64 systemd
2017-01-25 00:48:25:     2 root      20   0       0      0      0 S   0.0  0.0   0:00.04 kthreadd
2017-01-25 00:48:25:     3 root      20   0       0      0      0 S   0.0  0.0   0:08.62 ksoftirqd/0
2017-01-25 00:48:25:     5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H

のように記録される(日付のフォーマットは自由に変えられます)ので、

% grep '2017-01-25 00:48' top.log

のようにして、検索しやすくなります。

で、作ってから気づいたのですが、まったく同じ名前の同様のコマンドが C で書かれていました。
https://github.com/marcomorain/tcat

orz

とりあえず、違いを出すために、cat のオプションを全て実装してみました("-n" 以外使ったことないけど)。
"-v", "-E", "-T" あたりの実装は、cat のソースコードからロジックをそのまま移した感じになります。