特別なコマンド無しで「◯◯時からXX時までの間のログを抽出」というように、時間指定でログを抽出させる方法(awk,sed)

前回、timegrepコマンドを利用して指定した時間のログを抽出する方法について紹介したが、今回はそのような追加のパッケージ無しで同じことをする方法についてを記述する。
使用するコマンドは、プリインストールされているawkやsedといったコマンドを用いる。。

1.awkで抽出する

awkで時間指定でログを抽出する場合は、以下のようにコマンドを実行する。
開始時間、終了時間は、抽出するログのフォーマットで指定する必要がある点に注意。

awk -F - '"開始時間" < $1 && $1 <= "終了時間"' /抽出を行うログのPATH

実際に実行してみた結果がこちら。

[root@dctest01 ~]# awk -F - '"Apr  5 14:30:00" < $1 && $1 <= "Apr  5 15:00:00"' /var/log/messages
Apr  5 14:34:14 dctest01 smbd[29429]: [2015/04/05 14:34:14.560506,  0] ../source3/printing/print_cups.c:151(cups_connect)
Apr  5 14:34:14 dctest01 smbd[29429]: Unable to connect to CUPS server localhost:631 - 通信端点が接続されていません
Apr  5 14:34:14 dctest01 smbd[2351]: [2015/04/05 14:34:14.574323,  0] ../source3/printing/print_cups.c:529(cups_async_callback)
Apr  5 14:34:14 dctest01 smbd[2351]: failed to retrieve printer list: NT_STATUS_UNSUCCESSFUL
Apr  5 14:47:15 dctest01 smbd[29452]: [2015/04/05 14:47:15.339598,  0] ../source3/printing/print_cups.c:151(cups_connect)
Apr  5 14:47:15 dctest01 smbd[29452]: Unable to connect to CUPS server localhost:631 - 通信端点が接続されていません
Apr  5 14:47:15 dctest01 smbd[2351]: [2015/04/05 14:47:15.355067,  0] ../source3/printing/print_cups.c:529(cups_async_callback)
Apr  5 14:47:15 dctest01 smbd[2351]: failed to retrieve printer list: NT_STATUS_UNSUCCESSFUL
[root@dctest01 ~]#

2.sedで抽出する

次に、sedで抽出する方法。
awkよりもわかりづらいが、以下のように指定して抽出する。

sed -n '/開始時間/ , /終了時間/p' /抽出を行うログのPATH

この時注意したいのが、開始時間や終了時間に指定した文字列とマッチする時間がログに記録されている必要がある。
例えば、開始時間に「16:00」、終了時間に「16:10」で指定して、ログに「16:05」のログがあったとしても、文字列としてマッチしないため抽出されない。

[root@dctest01 ~]# sed -ne '/Apr  5 18:00/,/Apr  5 18:1/p' /var/log/secure
Apr  5 18:00:01 dctest01 snoopy[30069]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/clear]: clear
Apr  5 18:00:11 dctest01 snoopy[30071]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/awk]: awk -F - "Apr  5 13:30:00" < $1 && $1 <= "Apr  5 14:00:00" /var/log/messages
Apr  5 18:00:20 dctest01 snoopy[30074]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/awk]: awk -F - "Apr  5 14:30:00" < $1 && $1 <= "Apr  5 15:00:00" /var/log/messages
Apr  5 18:00:23 dctest01 snoopy[30075]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/clear]: clear
Apr  5 18:00:24 dctest01 snoopy[30076]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/awk]: awk -F - "Apr  5 14:30:00" < $1 && $1 <= "Apr  5 15:00:00" /var/log/messages
Apr  5 18:01:01 dctest01 snoopy[30078]: [uid:0 sid:2616 tty:(none) cwd:/ filename:/usr/sbin/unix_chkpwd]: /usr/sbin/unix_chkpwd root chkexpiry
Apr  5 18:01:01 dctest01 snoopy[30079]: [uid:0 sid:30079 tty:(none) cwd:/root filename:/bin/run-parts]: run-parts /etc/cron.hourly
Apr  5 18:01:01 dctest01 snoopy[30081]: [uid:0 sid:30079 tty:(none) cwd:/root filename:/bin/basename]: basename /etc/cron.hourly/0anacron
Apr  5 18:01:01 dctest01 snoopy[30082]: [uid:0 sid:30079 tty:(none) cwd:/root filename:/bin/logger]: logger -p cron.notice -t run-parts(/etc/cron.hourly)[30079] starting 0anacron
Apr  5 18:01:01 dctest01 snoopy[30083]: [uid:0 sid:30079 tty:(none) cwd:/root filename:/etc/cron.hourly/0anacron]: /etc/cron.hourly/0anacron
Apr  5 18:01:01 dctest01 snoopy[30084]: [uid:0 sid:30079 tty:(none) cwd:/root filename:/bin/awk]: awk -v progname=/etc/cron.hourly/0anacron progname {
                                   print progname ":\n"
                                   progname="";
                               }
                               { print; }
Apr  5 18:01:01 dctest01 snoopy[30085]: [uid:0 sid:30079 tty:(none) cwd:/root filename:/bin/cat]: cat /var/spool/anacron/cron.daily
Apr  5 18:01:01 dctest01 snoopy[30086]: [uid:0 sid:30079 tty:(none) cwd:/root filename:/bin/date]: date +%Y%m%d
Apr  5 18:01:01 dctest01 snoopy[30087]: [uid:0 sid:30079 tty:(none) cwd:/root filename:/bin/basename]: basename /etc/cron.hourly/0anacron
Apr  5 18:01:01 dctest01 snoopy[30088]: [uid:0 sid:30079 tty:(none) cwd:/root filename:/bin/logger]: logger -i -p cron.notice -t run-parts(/etc/cron.hourly) finished 0anacron
Apr  5 18:01:01 dctest01 snoopy[30089]: [uid:0 sid:30079 tty:(none) cwd:/root filename:/bin/basename]: basename /etc/cron.hourly/0yum-hourly.cron
Apr  5 18:01:01 dctest01 snoopy[30090]: [uid:0 sid:30079 tty:(none) cwd:/root filename:/bin/logger]: logger -p cron.notice -t run-parts(/etc/cron.hourly)[30079] starting 0yum-hourly.cron
Apr  5 18:01:01 dctest01 snoopy[30091]: [uid:0 sid:30079 tty:(none) cwd:/root filename:/etc/cron.hourly/0yum-hourly.cron]: /etc/cron.hourly/0yum-hourly.cron
Apr  5 18:01:01 dctest01 snoopy[30092]: [uid:0 sid:30079 tty:(none) cwd:/root filename:/bin/awk]: awk -v progname=/etc/cron.hourly/0yum-hourly.cron progname {
                                   print progname ":\n"
                                   progname="";
                               }
                               { print; }
Apr  5 18:01:01 dctest01 snoopy[30093]: [uid:0 sid:30079 tty:(none) cwd:/root filename:/bin/basename]: basename /etc/cron.hourly/0yum-hourly.cron
Apr  5 18:01:01 dctest01 snoopy[30094]: [uid:0 sid:30079 tty:(none) cwd:/root filename:/bin/logger]: logger -i -p cron.notice -t run-parts(/etc/cron.hourly) finished 0yum-hourly.cron
Apr  5 18:06:34 dctest01 snoopy[30107]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/clear]: clear
Apr  5 18:06:34 dctest01 snoopy[30108]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/sed]: sed -n /Apr  5 14:30:00/ , /Apr  5 15:00:00/p /var/log/messages
Apr  5 18:06:46 dctest01 snoopy[30109]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/sed]: sed -n /Apr  5 14:30:00/ , /Apr  5 15:00:00/p /var/log/messages
Apr  5 18:07:39 dctest01 snoopy[30111]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/sed]: sed -n /Apr  5 14:30:00/ ,/Apr  5 15:00:00/p /var/log/messages
Apr  5 18:08:24 dctest01 snoopy[30113]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/sed]: sed -n /Apr  5 14:30:00/ ,/Apr  5 15:00:00/p /var/log/audit/audit.log
Apr  5 18:08:34 dctest01 snoopy[30114]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/awk]: awk -F - "Apr  5 14:30:00" < $1 && $1 <= "Apr  5 15:00:00" /var/log/audit/audit.log
Apr  5 18:08:41 dctest01 snoopy[30115]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/cat]: cat /var/log/audit/audit.log
Apr  5 18:08:59 dctest01 snoopy[30116]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/cat]: cat /var/log/secure
Apr  5 18:09:28 dctest01 snoopy[30118]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/awk]: awk -F - "Apr  5 14:30:00" < $1 && $1 <= "Apr  5 15:00:00" /var/log/secure
Apr  5 18:09:39 dctest01 snoopy[30119]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/awk]: awk -F - "Apr  5 12:30:00" < $1 && $1 <= "Apr  5 15:00:00" /var/log/secure
Apr  5 18:09:48 dctest01 snoopy[30120]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/sed]: sed -n /Apr  5 14:30:00/ ,/Apr  5 15:00:00/p /var/log/secire
Apr  5 18:09:50 dctest01 snoopy[30121]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/sed]: sed -n /Apr  5 14:30:00/ ,/Apr  5 15:00:00/p /var/log/secure
Apr  5 18:10:38 dctest01 snoopy[30124]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/sed]: sed -n /^Apr  5 14:30:00/ ,/Apr  5 15:00:00/p /var/log/secure
Apr  5 18:43:05 dctest01 snoopy[30198]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/sed]: sed -ne /Apr  5 18:00/,/Apr  5 18:1/p /var/log/messages
Apr  5 18:43:30 dctest01 snoopy[30201]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/clear]: clear
Apr  5 18:43:35 dctest01 snoopy[30202]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/sed]: sed -ne /Apr  5 18:00/,/Apr  5 18:1/p /var/log/secure
Apr  5 18:43:45 dctest01 snoopy[30203]: [uid:0 sid:29899 tty:/dev/pts/20 cwd:/root filename:/bin/sed]: sed -ne /Apr  5 18:00/,/Apr  5 18:1/p /var/log/secure

基本的にはawkの方が扱いやすいため、こちらを利用すると良いだろう。