前にscriptコマンドで取得するターミナルログにタイムスタンプを付与するというスクリプトを書いたことがあるのだが、また必要になって調べてみたところ、そもそもこれワンライナーで書けるなと気づいたので書き直しをした。

具体的には、以下のように記述する。

script -fq >(awk '{print strftime("%F %T ") $0}{fflush() }'>> PATH)

これで、scriptコマンドの一時ファイルも存在させずにタイムスタンプが付与されたターミナルログができあがる。 実際に記録したログは以下。

[root@BS-PUB-CENT7-02 ~]# cat session.log
2017-02-02 11:06:26 スクリプトは 2017年02月02日 11時06分26秒
2017-02-02 11:06:26  に開始しました[root@BS-PUB-CENT7-02 ~]#
2017-02-02 11:06:27 [root@BS-PUB-CENT7-02 ~]#
2017-02-02 11:06:27 [root@BS-PUB-CENT7-02 ~]# ls -al
2017-02-02 11:06:27 合計 56
2017-02-02 11:06:27 dr-xr-x---.  6 root root 4096  2月  2 11:06 .
2017-02-02 11:06:27 dr-xr-xr-x. 17 root root 4096  1月 29 23:47 ..
2017-02-02 11:06:27 -rw-------.  1 root root 4115  2月  2 11:00 .bash_history
2017-02-02 11:06:27 -rw-r--r--.  1 root root   18 12月 29  2013 .bash_logout
2017-02-02 11:06:27 -rw-r--r--.  1 root root  176 12月 29  2013 .bash_profile
2017-02-02 11:06:27 -rw-r--r--.  1 root root  176 12月 29  2013 .bashrc
2017-02-02 11:06:27 drwxr-xr-x.  6 root root   89  1月 30 22:59 .cpan
2017-02-02 11:06:27 -rw-r--r--.  1 root root  100 12月 29  2013 .cshrc
2017-02-02 11:06:27 drwxr-xr-x.  3 root root   18  1月 31 23:28 .gem
2017-02-02 11:06:27 drwxr-----.  3 root root   18  1月 30 22:58 .pki
2017-02-02 11:06:27 -rw-r--r--.  1 root root  129 12月 29  2013 .tcshrc
2017-02-02 11:06:27 -rw-------.  1 root root 4492  2月  1 08:05 .viminfo
2017-02-02 11:06:27 -rw-------.  1 root root  986  1月  2  2016 anaconda-ks.cfg
2017-02-02 11:06:27 drwxr-xr-x. 10 root root 4096  1月 30 22:58 dategrep
2017-02-02 11:06:27 -rw-r--r--.  1 root root  334  2月  2 11:06 session.log
2017-02-02 11:06:28 [root@BS-PUB-CENT7-02 ~]#
2017-02-02 11:06:29 [root@BS-PUB-CENT7-02 ~]# exit
2017-02-02 11:06:29 exit

タイムスタンプのフォーマットは、awkのstrftimeのとこで指定しているので、変更したい場合はそこを書き換えてやればよい。 ちなみに、syslogに飛ばす場合は以下のように記述する(ただ、バックスペースなども含めて送信してしまうのであまり良くないかも…?改善の必要あり)。

script -fq >(logger)

Mac OS Xの場合だと都度書き込みのオプションが「-f」ではなく「-F」になるので注意。 ちなみに、scriptコマンドで"特定のコマンドの結果をタイムスタンプ付きで記録"する場合だと、Linux/Mac OS X(というかBSD)別で以下のように実行する。

# Linux
script -fq -c "コマンド" >(awk '{print strftime("%F %T ") $0}{fflush() }'>> PATH)

# Mac OS X
script -Fq >(awk '{print strftime("%F %T ") $0}{fflush() }'>> PATH) コマンド("などで囲まない)