为 df 输出命令的每一行添加时间戳?

Posted

技术标签:

【中文标题】为 df 输出命令的每一行添加时间戳?【英文标题】:Add timestamp for each line on the df output command? 【发布时间】:2020-02-04 20:28:55 【问题描述】:

我想为df 输出的每一行添加日期。

我试过了:

df -m | awk 'print `date +%Y-%m`";"$1";"$2";"$3 '

...但它不起作用。

如何添加日期?

【问题讨论】:

这是linux 还是aix? AIX 和 Linux :) 我建议Dave Cross's solution 应该可以在这些平台上移植。 df -m 在 Linux 和 AIX 上是否提供相同的输出? 您可能需要考虑将-P 选项设置为df 以提供可移植/一致的输出格式。 【参考方案1】:

这是另一种选择:

df -m | awk 'print strftime("%Y-%m"), $0'

这是上面命令的输出:

$ df -m | awk 'print strftime("%Y-%m"), $0'
2019-10 Filesystem                     1M-blocks   Used Available Use% Mounted on
2019-10 devtmpfs                            9852      0      9852   0% /dev
2019-10 tmpfs                               9871    132      9740   2% /dev/shm
2019-10 tmpfs                               9871      2      9869   1% /run
2019-10 /dev/mapper/fedora_canvas-root     50141  14731     32834  31% /
2019-10 tmpfs                               9871      1      9871   1% /tmp
2019-10 /dev/sda5                            976    243       667  27% /boot
2019-10 /dev/mapper/fedora_canvas-home   1277155 217435    994777  18% /home
2019-10 tmpfs                               1975     63      1912   4% /run/user/1000
$ 

这是一个替代版本,只在 OP 上打印您想要的 3 列:

df -m | awk 'print strftime("%Y-%m"), $1, $2, $3' | column -t

以及对应的输出:

$ df -m | awk 'print strftime("%Y-%m"), $1, $2, $3' | column -t
2019-10  Filesystem                      1M-blocks  Used
2019-10  devtmpfs                        9852       0
2019-10  tmpfs                           9871       132
2019-10  tmpfs                           9871       2
2019-10  /dev/mapper/fedora_canvas-root  50141      14731
2019-10  tmpfs                           9871       1
2019-10  /dev/sda5                       976        243
2019-10  /dev/mapper/fedora_canvas-home  1277155    217435
2019-10  tmpfs                           1975       63
$

【讨论】:

strftime() 是 GNU awk 扩展。在 AIX 上可用? @glennjackman,这是一个很好的观点,OP 必须考虑到这一点。【参考方案2】:

你可以这样使用:

df -m | awk -v dt=$(date "+%Y-%m") 'print dt "::", $0'

我们使用-v dt=$(date "+%Y-%m") 在shell 中执行日期命令,并在参数dt 中将其传递给awk

如果您只想要 df 命令输出的前 3 列,请使用:

df -m | awk -v dt=$(date "+%Y-%m") 'print dt, $1, $2, $3'

【讨论】:

【参考方案3】:

Perl 解决方案。

df -m | perl -MPOSIX=strftime -alpe '$_ = strftime("%Y-%M ", localtime) . "@F[0..2]"'

命令行选项:

-M : 从 POSIX 模块加载strftime() 函数 -a : 将空格上的输入记录自动拆分为@F -l :​​ 从输入中删除换行符并将它们添加到输出中 -p : 将每条输入记录放入$_,执行代码然后打印$_ -e : 为每个输入记录运行此代码

代码通过将日期 (strftime("%Y-%M ", localtime)) 与输入记录的前三列 (@F[0 .. 2]) 连接起来来更新 $_

【讨论】:

你会希望'$_ = join(";", strftime("%Y-%m", localtime), @F[0..2])' 得到 OP 想要的输出。

以上是关于为 df 输出命令的每一行添加时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

从 Windows cmd 向 telnet 会话日志的每一行添加时间戳

为ping添加时间戳后台运行实时输出保存日志

Pandas:如何添加两个时间戳值?

Python:从时间戳到日期时间

如何使用 cron 为日志输出条目添加时间戳?

js把时间戳只转换为“时“和”分”