파일의 시간 형식 변경

파일의 시간 형식 변경

sar 명령의 출력이 있지만 시간이 POSIX가 아닙니다.

Linux 2.6.32-431.29.2.el6.x86_64 (test.server.com)  2015-08-01  _x86_64_    (32 CPU)

12:00:01 AM     CPU      %usr     %nice      %sys   %iowait    %steal      %irq     %soft    %guest     %idle
12:10:01 AM     all      0.01      0.00      0.07      0.00      0.00      0.00      0.00      0.00     99.93
12:10:01 AM       0      0.01      0.00      0.02      0.00      0.00      0.00      0.00      0.00     99.97
[…]

나는 12:00:01 AM 에서 posix 00:00:01 까지의 시간으로 시작하는 줄의 시간을 바꾸는 방법을 찾으려고 노력 중입니다.

어떤 아이디어가 있나요?

매우 감사합니다!

답변1

개인적으로 나는 이렇게 할 것이다:

  • 시간을 에포크 형식으로 구문 분석합니다.
  • 원하는 출력 형식으로 에포크 시간을 인쇄합니다.

예를 들어:

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;
use Time::Piece; 

while ( <DATA> ) {
   my ( $time_str ) = m/^([\d\:]+ [AP]M)/;
   print $time_str, "=>",;
   my $newtime = Time::Piece -> strptime ( $time_str, "%I:%M:%S %p" );
   print $newtime->strftime("%H:%M:%S"),"\n";
}

__DATA__
12:00:01 AM     CPU      %usr     %nice      %sys   %iowait    %steal      %irq     %soft    %guest     %idle
12:10:01 AM     all      0.01      0.00      0.07      0.00      0.00      0.00      0.00      0.00     99.93
12:10:01 AM       0      0.01      0.00      0.02      0.00      0.00      0.00      0.00      0.00     99.97

따라서 스크립트는 다음과 같습니다.

#!/usr/bin/env perl

use strict;
use warnings;

use Time::Piece;

while (<>) {
    if ( my ($time_str) = m/^([\d\:]+ [AP]M)/ ) {
        my $new_time_str = Time::Piece->strptime( $time_str, "%I:%M:%S %p" )
            ->strftime("%H:%M:%S");
        s/$time_str/$new_time_str/;
    }
    print;
}

이것은 "인라인"으로 작동합니다. <>Perl의 마법을 사용하면 다음이 가능합니다.

  • ./myscript.pl some_file
  • some_command | ./myscript.pl

다음과 같이 선형화하는 것이 가능할 수 있습니다.

perl -MTime::Piece -pe 's/^([\d\:]+ [AP]M)/Time::Piece->strptime( $1, q{%I:%M:%S %p} )->strftime(q{%H:%M:%S})/e;'

답변2

향후 문서에서는 로케일(아마도 en_US 또는 유사)을 삭제하여 24시간 형식으로 출력을 얻을 수 있으므로 AM/PM이 표시됩니다. 예를 들어:

$ LANG=C sar -u 2 5
13:32:30        CPU     %user     %nice   %system   %iowait    %steal     %idle

하지만

$ LANG=en_US sar -u 2 5
01:32:02 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle

관련 정보