如何通过shell为流数据中的每一行添加时间戳?
off999 2024-10-31 14:06 41 浏览 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 脚本编程最佳实践》专栏,里面有我在一线互联网大厂的实际生产经验和最佳实践,帮助你高效完成各种自动化任务。
相关推荐
- gif制作软件app(gif制作软件app推荐)
-
我有一个制作gif动画的exe软件,在电脑上直接打开就能用,如果需要,我可以发你哦!以下手机软件可以给GIF图片加文字:1、GIF制作appGIF制作app是一款专业编辑Gif文件工具,它可以实现gi...
- ai绘图免费软件(ai制图软件免费)
-
推荐使用Procreate应用程序1因为它是一款功能强大的应用程序,具有出色的绘图和动画工具。2Procreate可以在iPad上使用,具有高质量的分辨率和颜色深度,可以创建出色的动画效果。3...
-
- 强力恢复数据软件免费版(强力数据恢复软件多少钱)
-
效果还是不错的,如果你的苹果手机有重要的数学不小心丟失了,就可以通过强力苹果恢复精灵找回来,而且真对手机不同的数据,都是非常到位的分类包括通讯类,图片以及其他三大版快若您要存储机身内存文件,聊天记录及连系人不慎删除且没有提前备份数据,那个...
-
2026-01-19 04:51 off999
- 魔兽地图下载网址(魔兽地图下载网址是什么)
-
魔兽地图可以通过以下步骤进行下载:打开魔兽地图下载网站,如hiveworkshop.com、epicwar.com等。在网站上搜索您想要下载的地图名称或关键词。找到您想要下载的地图后,点击下载按钮或链...
- qq阅读免费版下载(qq阅读免费版下载2019)
-
有免费栏目,但是一般里面的书都不是很好看。然后有的好看的书有免费章节,比如前面60章是免费的,后面的就开始收费。个人建议,可以开个QQ阅读的会员,QQ阅读会员就有专门的免费专区,里面每周都会更新很多的...
- 实时变声器(实时变声器下载)
-
有不少安卓免费变声器软件推荐MorphVOXPro中文版。这是一款非常有趣的语音变声器软件,程序的主要功能可以帮助你在上网用QQ、YY、Skype网络电话或者其他聊天工具进行语音聊天时随心所欲的变换...
- 汉语大词典电子版(汉语大词典电子版pdf)
-
《汉语大字典》是当今世界上规模最大、收集汉字单字最多、释义最全的一部汉语字典。全书约2000万字,共收单字56000多个,几乎包括了各种古今文献和图书资料中出现的所有汉字,可以说是汉语字典的集大成者...
- 免费照片处理软件app(免费照片处理软件哪个最好)
-
首先打开Photoshop,导入一张照片点击打开打开照片之后,同时按ctrl+j复制一个图层在菜单栏里面选择“滤镜”——“锐化”——“智能锐化”适当将锐化的半径调高一些,勾选“更加精确”锐化后放大图片...
- 免费的ps电脑软件(免费的ps电脑软件有哪些)
-
.任何一个版本都不是免费的,但基本所有版本都有破解版或者绿色版,可以去360软件管家里面下载或者电脑管家里也有,最新版的是PSCC版。photoshop是adobe公司旗下的产品,正确来说,购买正...
- 照片恢复(照片恢复免费版下载)
-
方法/步骤 1.首先下载一个数据恢复软件。 2.安装到电脑上,然后把手机和电脑连接起来。 3.接着我们用下载好的数据恢复软件扫描手机。 4.然后找出要恢复的文件照片。 5.在电脑上选在一个磁...
- tiktok官方网站入口(tiktok官方网站入口免费)
-
入口就是TikTok商店卖家。具体步骤如下:为了加入TikTok商店,您首先需要一个TikTok帐户。一旦您拥有TikTok帐户并且超过了符合条件的年龄,就可以使用它注册为TikTok商店卖家。卖家...
- adobe flash player播放器(adobe flash player viewer)
-
不同操作系统不同浏览器,开启Adobeflashplayer的方法各有不同。开启的前提当然是正确安装喽,不同操作系统不同浏览器安装Adobeflashplayer方法也是各不相同的。Wind...
- 央视cctv5体育直播(央视cctv5体育直播在线观看免费)
-
现在全国每家都有机顶盒,在机顶盒上就可以看CCTV所有频道。也可以用手机浏览器搜索CCTV5体育频道。还有就是可以手机上下载安装央视影音APP,央视频APP都可以看。中央电视台体育频道(频道呼号:CC...
欢迎 你 发表评论:
- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
