前にscriptコマンドで取得するターミナルログにタイムスタンプを付与するというスクリプトを書いたことがあるのだが、また必要になって調べてみたところ、そもそもこれワンライナーで書けるなと気づいたので書き直しをした。
具体的には、以下のように記述する。
bash
script -fq >(awk '{print strftime("%F %T ") $0}{fflush() }'>> PATH)
これで、scriptコマンドの一時ファイルも存在させずにタイムスタンプが付与されたターミナルログができあがる。 実際に記録したログは以下。
shell[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に飛ばす場合は以下のように記述する(ただ、バックスペースなども含めて送信してしまうのであまり良くないかも…?改善の必要あり)。
bashscript -fq >(logger)
Mac OS Xの場合だと都度書き込みのオプションが「-f」ではなく「-F」になるので注意。 ちなみに、scriptコマンドで"特定のコマンドの結果をタイムスタンプ付きで記録"する場合だと、Linux/Mac OS X(というかBSD)別で以下のように実行する。
bash
# 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) コマンド("などで囲まない)