sed替换所有记录仅生成单个时间戳,如何获取实时毫秒级时间戳?
为每行文本生成实时毫秒级时间戳替换
问题场景
现有文本文件toreplacefile.txt内容如下:
TIMESTAMP_line1 TIMESTAMP_line2 TIMESTAMP_line3 TIMESTAMP_line4 TIMESTAMP_line5
使用sed命令替换时,所有行的TIMESTAMP被替换为同一个时间戳:
sed 's/TIMESTAMP/$(date +"%Y-%m-%dT%H:%M:%S.%3N")/g' toreplacefile.txt
输出结果:
2022-11-14T10:11:43.654_line1 2022-11-14T10:11:43.654_line2 2022-11-14T10:11:43.654_line3 2022-11-14T10:11:43.654_line4 2022-11-14T10:11:43.654_line5
期望每行的时间戳在毫秒级有差异:
2022-11-14T10:11:43.654_line1 2022-11-14T10:11:43.656_line2 2022-11-14T10:11:43.657_line3 2022-11-14T10:11:43.660_line4 2022-11-14T10:11:43.661_line5
问题原因
sed命令执行前,shell会先解析$(date...)部分,仅执行一次获取时间戳,之后所有替换都复用这个值,因此所有行的时间戳完全相同。
解决方案
需要让每行处理时都重新获取一次实时时间戳,以下两种方法均可实现:
方法1:使用awk逐行处理
awk支持逐行执行系统命令,每行单独获取时间戳:
awk '{ cmd = "date +\"%Y-%m-%dT%H:%M:%S.%3N\"" cmd | getline timestamp close(cmd) sub(/TIMESTAMP/, timestamp) print $0 }' toreplacefile.txt
cmd | getline timestamp:执行date命令并读取输出到变量timestampclose(cmd):关闭管道,避免系统资源泄漏sub(/TIMESTAMP/, timestamp):替换当前行的TIMESTAMP为实时时间戳
方法2:使用Bash逐行读取循环
借助Bash的while read循环逐行处理文本,每次替换时重新执行date命令:
while IFS= read -r line; do echo "${line//TIMESTAMP/$(date +"%Y-%m-%dT%H:%M:%S.%3N")}" done < toreplacefile.txt
IFS= read -r line:保留行内的空格和特殊字符,正确读取每行内容${line//TIMESTAMP/...}:替换当前行中所有TIMESTAMP为实时生成的时间戳
效果说明
两种方法都会为每行单独触发一次date命令,由于命令执行需要一定时间(远大于1毫秒),因此每行的时间戳毫秒数会自然产生差异,满足需求。
内容的提问来源于stack exchange,提问作者TheNoobCoder
相关产品推荐
相关产品推荐

