ログから特定の時刻を含むレコードを切り出す

特定の時刻を含むレコードを切り出すサンプルです。

use strict;
use warnings;

print "(1)特定範囲の時刻を含むレコードを切り出す。\n";
my @records = (
  '1  7:00:00 aaa',
  '2  8:00:00 iii',
  '3  9:00:00 uuu',
  '4 10:00:00 eee',
  '5 11:00:00 ooo',
);

my $start_time = '08:00:00';

# この時刻は含まないこととする
my $end_time = '11:00:00'; 

for my $record (@records) {
  
  # 時刻を切り出す
  if ($record =~ / (\d{1,2}):(\d{2}):(\d{2}) /) {
    # 書式をあわせることで文字列として比較ができる。
    # '7:00:00' -> '07:00:00'
    my $time = sprintf("%02s:%02s:%02s", $1, $2, $3);
    
    # 開始時刻から終了時刻までに含まれるレコードを切り出す。
    if ($time ge $start_time && $time lt $end_time) {
      print $record . "\n";
    }
  }
}

実行結果

(1)特定範囲の時刻を含むレコードを切り出す。
2  8:00:00 iii
3  9:00:00 uuu
4 10:00:00 eee

解説

時刻のフォーマットを整える

sprintf関数を使用して時刻のフォーマットを整えます。同じ長さの文字列長に整えることによって文字列での比較が可能になります。

if ($record =~ / (\d{1,2}):(\d{2}):(\d{2}) /) {
  my $time = sprintf("%02s:%02s:%02s", $1, $2, $3);
  
  if ($time ge $start_time && $time lt $end_time) {
    print $record . "\n";
  }
}

開始時刻から終了時刻までに含まれるレコードを切り出す

ge、lt は文字列での辞書順でどちらが先かを比較する演算子です。 geはgreater than or equel( 以上 ) の略でlt は lower than( より小さい )の略です。

if ($time ge $start_time && $time lt $end_time) {
  print $record . "\n";
}

Perl逆引き辞典/日付と時刻へ

業務に役立つPerl

Perlテキスト処理のエッセンス

PerlでポータブルなLinuxファイル管理入門

ITエンジニアの求人情報など

 ITエンジニアの求人情報・Webサービス・ソフトウェア・スクールなどの情報。

システム開発のお問い合わせ