修改iostat -t时间输出格式

修改iostat -t时间输出格式

我试图绘制各种 iostat 结果的结果。为此,我想使用https://clusterbuffer.wordpress.com/file-system-tools/iostat_plot/iostat-plotter-v3/

无论如何 - 由于某些无法解释的原因,该脚本将其期望的时间格式硬编码,并且期望 12 小时 AM/PM 时间格式,我不认为这是任何 Linux 区域设置的一部分。我正在寻找一种方法来告诉 iostat -t 以 AM/PM 格式输出,但失败了。据说它使用了环境变量 S_TIME_FORMAT,这对我来说是未知的,似乎是 iostat 特定的且未记录。系统/用户 LC_TIME 按照惯例设置为“C”。有什么想法如何诱导 iostat 使用 am/pm 格式吗?由于 iostat 是二进制文件,我无法修改它调用 strftime/localtime 的方式。提前致谢!

# locale
LANG=en_US.UTF-8
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=C 

答案1

您正在寻找的语言环境是 en_US:

[xxx]# export LANG=C
[xxx]# iostat -t
Linux 4.14.8-300.fc27.x86_64 (osvetlik.unicorn)     01/10/18    _x86_64_    (4 CPU)

01/10/18 18:36:47
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          26.26    0.09    5.56    0.09    0.00   68.00

[xxx]# export LANG="en_US.UTF-8"
[xxx]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
[xxx]# iostat -t
Linux 4.14.8-300.fc27.x86_64 (osvetlik.unicorn)     01/10/2018  _x86_64_    (4 CPU)

01/10/2018 06:37:41 PM
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          26.25    0.09    5.56    0.09    0.00   68.01

这里重要的区域变量是(但如果您已设置它,则LC_TIME必须更改它,因为它会阻止对其他变量进行不同的设置)。您必须将此变量设置为才能使时间格式正确。仅设置为没有帮助。只需使用命令来验证是否设置正确。LC_ALLLC_en_USLANGen_USlocaleLC_TIME

未设置的输出LC_ALL

[xxx]# export LC_ALL= 
[xxx]# export LC_TIME="en_US.UTF-8"
[xxx]# locale
LANG=C
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME=en_US.UTF-8
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=
[xxx]# iostat -t
Linux 4.14.8-300.fc27.x86_64 (osvetlik.unicorn)     01/12/2018  _x86_64_    (4 CPU)

01/12/2018 09:48:05 AM

LC_ALL

[xxx]# export LC_ALL="en_US.UTF-8"
[xxx]# locale
LANG=C
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
[xxx]# iostat -t
Linux 4.14.8-300.fc27.x86_64 (osvetlik.unicorn)     01/12/2018  _x86_64_    (4 CPU)

01/12/2018 09:49:38 AM

简短解决方案:

LC_ALL="en_US.UTF-8" iostat -t

答案2

不能在注释中使用格式,因此在此处粘贴代码块:

系统甚至已经在 /etc/locale.conf 中定义了该区域设置。不幸的是,情况并非如此:

[root@xxx]# echo $LANG
en_US.UTF-8
[root@xxx]# iostat -t
Linux 3.10.0-514.6.1.el7.x86_64 (xxx)  01/11/18        _x86_64_            (48 CPU)

01/11/18 08:43:46
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
[...]

答案3

在 Ondřej 的帮助下我解决了这个问题。

LC_ALL=en_US.UTF-8 iostat -t    

作品。

相关内容