侧边栏壁纸
博主头像
Ivan Zhang

所谓更牛,就是换个罪受

  • 累计撰写 48 篇文章
  • 累计创建 54 个标签
  • 累计收到 6 条评论

目 录CONTENT

文章目录

Linux 批量替换文件中的时间戳为字符串

Ivan Zhang
2024-01-22 / 0 评论 / 0 点赞 / 588 阅读 / 2,540 字
温馨提示:
本文最后更新于 ,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
有什么问题或观点欢迎评论留言,或者 交流。
如果觉得文章对您有所帮助,可以给博主打赏鼓励一下。

时间戳转字符串

借助 awk 命令或其他编程语言来处理。awk 命令使用 strftime 函数将时间戳转换为日期字符串,然后使用 print 打印替换后的字符串。

请注意,上述命令仅在 Unix 或类 Unix 系统上可用。如果你在其他操作系统上使用,请注意该系统上 awk 命令的语法和选项可能会有所不同。如果不使用 awk,你也可以使用其他编程语言(如 PythonPerl 等)来实现类似的功能。

echo "Timestamp: 1642592575" | awk '{ print "Timestamp: " strftime("%Y-%m-%d %H:%M:%S", $2) }'

批量替换文件中的时间戳为指定时间格式字符串

awk 'match($0, /[0-9]{10}/) { \
    timestamp = substr($0, RSTART, RLENGTH); \
    cmd = "date -d @" timestamp " +\"%Y-%m-%d %H:%M:%S\""; \
    cmd | getline result; \
    close(cmd); \
    gsub(/[0-9]{10}/, result); \
} \
{ \
    print \
}' input.txt > output.txt

命令解析:

  • awk:调用 awk 命令
  • match($0, /[0-9]{10}/):使用正则表达式 /[0-9]{10}/ 匹配当前行($0)中的时间戳。match 函数用于检查字符串是否与给定的正则表达式匹配,并返回匹配的起始位置和长度。
  • { timestamp = substr($0, RSTART, RLENGTH); cmd = "date -d @" timestamp " +\"%Y-%m-%d %H:%M:%S\""; cmd | getline result; close(cmd); gsub(/[0-9]{10}/, result); }:若匹配成功,执行的代码块。
    • timestamp = substr($0, RSTART, RLENGTH);:将匹配到的时间戳保存到 timestamp 变量中。substr 函数用于提取字符串的子串。
    • cmd = "date -d @" timestamp " +\"%Y-%m-%d %H:%M:%S\"";:构建调用 date 命令来将时间戳转换为日期字符串的命令。其中,-d 选项指定使用给定的时间戳,"+\"%Y-%m-%d %H:%M:%S\"" 是日期字符串的格式。
    • cmd | getline result;:执行命令,并将结果保存到 result 变量中。getline 函数用于从命令的输出中读取一行。
    • close(cmd);:关闭命令。
    • gsub(/[0-9]{10}/, result);:使用 gsub 函数将匹配到的时间戳替换为日期字符串。gsub 函数用于全局替换字符串中的内容。
  • { print }':无论是否匹配成功都会执行的代码块。这里的 print 用于打印每一行。
  • 最后,input.txt 是输入文件的名称,output.txt 是输出文件的名称。使用 > 重定向运算符将命令的输出存储到 output.txt 文件中。

错误示例

示例一

sed 命令使用正则表达式搜索一个或多个连续的数字(即时间戳),然后使用 date 命令将其替换为日期字符串。其中,-E 选项用于扩展正则表达式语法,([0-9]+) 是一个捕获组,\1 表示捕获的第一个组。date 命令中的 +%Y-%m-%d %H:%M:%S 格式定义了你要转换的日期字符串格式。

# sed 表达式部分 '' 括起来的 date 命令不会被执行
$ echo "Timestamp: 1642592575" | sed -E 's/([0-9]+)/$(date -d @\1 +"%Y-%m-%d %H:%M:%S")/'
Timestamp: $(date -d @1642592575 +"%Y-%m-%d %H:%M:%S")

# \1 捕获不会被解析
$ echo "Timestamp: 1642592575" | sed -E "s/([0-9]+)/$(date -d @\1 +'%Y-%m-%d %H:%M:%S')/"
Timestamp: 1970-01-01 08:00:01

示例二

借助 awk 命令或其他编程语言来处理。下面是一个使用 awk 命令的例子,改示例只能批量处理每行记录都是时间戳的情况:

# 只能替换每行内容都是时间戳的文件
awk '{ \
    cmd="date -d @"$0" +\"%Y-%m-%d %H:%M:%S\""; \
    cmd | getline result; \
    close(cmd); \
    sub(/[0-9]+/, result); \
    print \
}' input.txt > output.txt

命令解析:

  • awk:调用 awk 命令。
  • '{...}':是 awk 的代码块,当每一行被读取时会执行其中的操作。
  • cmd="date -d @"$0" +\"%Y-%m-%d %H:%M:%S\"";:创建一个变量 cmd,它包含将时间戳转换为日期字符串的命令。这里的 $0 是当前行的内容,%Y-%m-%d %H:%M:%S 是日期字符串的格式。
  • cmd | getline result;:执行命令并将输出结果存储在变量 result 中。这里使用 getline 函数从命令的输出中读取一行。
  • close(cmd);:关闭命令。
  • sub(/[0-9]+/, result);:使用 sub 函数将匹配到的时间戳替换为日期字符串。
    • [0-9]+ 是一个正则表达式,匹配一个或多个数字。
    • resultgetline 函数读取的命令输出的结果。
  • print:打印每一行,包括替换后的结果。

最后,input.txt 是输入文件的名称,output.txt 是输出文件的名称。使用 > 重定向运算符将命令的输出存储到 output.txt 文件中。

0

评论区