我有 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