百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

如何通过shell为流数据中的每一行添加时间戳?

off999 2024-10-31 14:06 34 浏览 0 评论

我希望每个文章通过一个简单小问题,来引导大家逐步深入了解学习shell,潜移默化的掌握shell编程的最佳实践。本文通过引入一个小问题以及解决方案来引导我们学习更多的shell命令行下时间的管理策略,以及了解这种管理方式在不同shell间的差异。

问题描述

在流中添加时间戳是一个挑战,因为没有标准工具可以完成这个任务。你可以安装针对此目的专门设计的工具(例如 moreutils 中的 ts,或者 daemontools 中的 multilog),或者使用某种编程语言编写过滤器。理想情况下,你不希望为每一行输入日志都创建一个 date(1) 命令的进程,因为这样太慢了。你应该使用内置工具。旧版本的 Bash 无法完成这个任务。你至少需要 Bash 4.2 版本才能使用 printf %(...)T 选项。否则,你可以使用 Perl、Python、Tcl 等编写程序来读取行并带有时间戳写出。

来尝试解决这个问题

在选择程序或编写函数(我们称之为 stamper)之后,你只需要将流通过它进行管道传输:

./myprogram 2>&1 | stamper > logfile

下面是一个简单的使用 Bash 4.2 的时间戳生成程序,以秒为单位进行精确度:

# Bash 4.2 or later
stamper() {
  while read -r; do
    printf '%(%Y-%m-%d %H:%M:%S)T %s\n' -1 "$REPLY"
  done
}

在支持 strftime(3) 中的 %s 的系统上,你还可以使用 %(%s)T 来生成 Unix 时间戳。但遗憾的是,这种方法不是可移植的。

Bash 5.0 添加了 EPOCHSECONDS(1 秒精度)和 EPOCHREALTIME(微秒精度)变量,可以替代(或与之一同使用)printf %()T

# Bash 5.0 or later
stamper() {
  while read -r; do
    printf '%s %s\n' "$EPOCHREALTIME" "$REPLY"
  done
}

还有一个专门为此目的设计的外部工具是 moreutils 包中的 ts。它的默认格式选择不当(采用人类可读的月份名称,以 Mmm DD YYYY 格式显示),但你可以指定一个格式。它支持微秒精度。

stamper() {
    ts "%Y-%m-%d %H:%M:%S.%.S"
}

另一个选择是 multilog,它可以提供纳秒级精度:

stamper() {
  multilog t e 2>&1
}

multilog 的 -e 选项告诉它将每一行写入 stderr,而不是自动轮转目录中的文件。multilog 使用 TAI64N 格式写入时间戳,类似于 Unix epoch 格式。你可以使用转换工具(例如 tai64nlocal)将其转换为可读格式。

以下是使用 Tcl 的示例,精度为微秒:

#!/usr/bin/env tclsh
while {[gets stdin line] >= 0} {
    set now [clock microseconds]
    set frac [expr {$now % 1000000}]
    set now [expr {$now / 1000000}]
    puts "[clock format $now -format {%Y-%m-%d %H:%M:%S}].$frac $line"
}

这最好作为一个单独的、独立的脚本来使用。把它嵌入到bash函数中也是可以的,尽管很难看:

stamper() {
  tclsh <(cat <<\EOF
    while {[gets stdin line] >= 0} {
      set now [clock microseconds]
      set frac [expr {$now % 1000000}]
      set now [expr {$now / 1000000}]
      puts "[clock format $now -format {%Y-%m-%d %H:%M:%S}].$frac $line"
    }
EOF
  )
}

对于 Perl 爱好者,以下是一个精度为1秒的示例:

stamper() {
    perl -p -e '$|=1; @l=localtime; printf "%04d-%02d-%02d %02d:%02d:%02d ",
        1900+$l[5], $l[4], $l[3], $l[2], $l[1], $l[0]'
}

从上述选择中选择一个,或者用你喜欢的编程语言编写另一个(或更好的)。

现在,在这一点上,一些读者可能要问如何在记录带有时间戳的流到文件的同时查看未修改的流。假设他们不完全疯狂,所以他们不关心 stdout 和 stderr 的分离。他们只想要将所有内容按照顺序混合在一个文件中,包括 stdout 和 stderr。

现在,运行脚本使其输出和 stderr 正常显示到屏幕,将带有时间戳的行写入日志文件相对容易:

./myscript 2>&1 | tee >(stamper >logfile)

将同样的内容放入一个脚本中稍微复杂一些:

#!/bin/bash
exec > >(tee >(stamper >logfile)) 2>&1

while sleep 0.2s; do
    echo "TPS report $RANDOM"
done

当然,如果脚本中写入 stamper 的部分使用 stdout 缓冲区,可能会存在缓冲问题。请考虑这一点。

我不在乎速度有多慢!我希望每秒调用 date(1) 一千次!我的电脑可以当作加热器使用
这是低效和可怕的。

stamper() {
  while read -r; do
    printf '%s %s\n' "$(date +'%Y-%m-%d %H:%M:%S')" "$REPLY"
  done
}

PS:请不要使用这种方法。这是愚蠢的。

More


如果你想学习如何编写更加健壮和可靠的 Shell 脚本,减少生产环境中的错误和故障,那么关注我吧!我会分享 Shell 编程的最佳实践和建议,帮助你提高 Shell 脚本的鲁棒性和可维护性。如果你想深入了解 Shell 编程的实际应用和技巧,可以关注我的《Shell 脚本编程最佳实践》专栏,里面有我在一线互联网大厂的实际生产经验和最佳实践,帮助你高效完成各种自动化任务。

相关推荐

戴尔官网保修查询入口(戴尔售后保质期查询)

可以按照以下步骤查询戴尔笔记本电脑的保修期:1.打开戴尔官网:https://www.戴尔.com/zh-cn/售后服务/保修政策.html2.点击页面上方的“服务与支持”按钮,进入戴尔的服务支持...

手机号邮箱登录入口(手机号邮箱官网)

手机163邮箱登录入口如下:163邮箱官网入口:https://smart.mail.163.com/login.htm点击进入登录或者注册邮箱即可。手机浏览器访问进入官网http://www.123...

sd卡(sd卡无法读取怎么修复)

  SD卡是大卡,相机用的;普通的手机内存卡,是小卡,正规的名称是macrosd卡,也就是微型SD卡。可以通过卡套转为普通的SD卡的大小。  其实就是大小不同。但手机上的内存卡,人们经常也俗称为SD...

路由器连接图(网络路由器连接图)
  • 路由器连接图(网络路由器连接图)
  • 路由器连接图(网络路由器连接图)
  • 路由器连接图(网络路由器连接图)
  • 路由器连接图(网络路由器连接图)
windows7蓝牙功能在哪里打开

点击搜索框在windows7系统主界面点击开始菜单,点击打开搜索框。输入命令输入services.msc后回车,在列表中找到并右击BluetoothSupportS...点击属性选择进入属性菜单,...

2010激活密钥(microsoft2010激活密钥)
2010激活密钥(microsoft2010激活密钥)

步骤/方式1officeprofessionalplus2010:(office专业版)6QFdx-pYH2G-ppYFd-C7RJM-BBKQ8Bdd3G-xM7FB-Bd2HM-YK63V-VQFdKVYBBJ-TRJpB-QFQ...

2025-11-19 04:03 off999

联想官方刷新bios工具(联想电脑刷新bios)

刷新BIOS需要使用联想的官方网站或授权维修中心来进行操作。以下是一些基本步骤:1.访问联想的官方网站,找到BIOS更新程序并下载。在下载过程中,请确保选择与您计算机型号匹配的版本。2.将下载的B...

苹果ios14系统下载(苹果ios14.1下载)
苹果ios14系统下载(苹果ios14.1下载)

1方法一步骤/方式一打开Appstore。步骤/方式二在搜索栏点击搜索框。步骤/方式三搜索并点击需要下载的软件。步骤/方式四点击获取。步骤/方式五最后验证ID密码即可。1.在应用商店搜索你要下载的应用名称。2.点击下载按钮,如果要求登...

2025-11-19 03:03 off999

office2010怎么免费永久激活密钥

用这个试试,一个KMS激活工具可以激活2010到2019的Office自家的目前用的就是这个microsoft6477.moe/1716.html直接使用这个Microsoftoffice2010...

类似爱加速的国内ip(类似爱加速的app)
类似爱加速的国内ip(类似爱加速的app)

推荐“V8盒子”。这一款免费无广告的模拟器,不同于其它软件盒子,而是类似于X8沙箱,满足游戏多开,画中画,悬浮球操作,熄屏后台运行等多功能的沙箱盒子.支持一键root,一键安装xposed框架,能在安卓/苹果手机上运行多个安卓/ios虚拟系...

2025-11-19 02:03 off999

阿里旺旺手机客户端(阿里旺旺手机app)

手机淘宝的旺旺在打开商品后,会看到左下角有个旺旺的图标,点击就可以联系了。  阿里旺旺是将原先的淘宝旺旺与阿里巴巴贸易通整合在一起的一个新品牌。它是淘宝和阿里巴巴为商人量身定做的免费网上商务沟通软件,...

最纯净的pe装机工具(pe工具哪个纯净)

U盘装系统步骤:1.制作U盘启动盘。这里推荐大白菜U盘启动盘制作工具,在网上一搜便是。2.U盘启动盘做好了,我们还需要一个GHOST文件,可以从网上下载一个ghost版的XP/WIN7/WIN8系统,...

装一个erp系统多少钱(wms仓库管理软件)

现在主流有客户端ERP和云端ERP两种客户端通常一次买断,价格在万元左右,但是还有隐性费用,你需要支付服务器、数据管理员,此外如果系统需要更新维护,你还需要支付另外一笔不菲的费用。云端ERP:优势...

cad2014序列号和密钥永久(autocad2014序列号和密钥)

1在cad2014中修改标注样式后,需要将其保存2单击“样式管理器”按钮,在弹出的窗口中选择修改后的标注样式,然后单击“设置为当前”按钮,再单击“保存当前样式”按钮,将其保存为新的样式名称3为了...

qq修改密保手机号(qq修改密保手机号是什么意思)

QQ更改绑定的手机号码操作步骤如下:1、打开手机主界面,找到“QQ”软件点击打开。2、输入正确的QQ账户和密码登录到qq主界面。3、点击左上角的头像“图片”,进入到个人中心界面。4、进入到个人中心界面...

取消回复欢迎 发表评论: