如何修改bash中date命令参数并将日期转时间戳功能封装为shell脚本
需求实现方案
以下两种方案均基于GNU Date(即你测试时使用的date --date语法的环境,适配Linux系统,macOS需先执行brew install coreutils,将脚本中所有date替换为gdate即可使用)
方案1:Bash 循环实现(逻辑清晰,适合小文件)
脚本内容(保存为convert_timeline.sh):
#!/bin/bash # 参数校验 if [ $# -ne 1 ] || [ ! -f "$1" ]; then echo "用法: $0 <timeline文件路径>" exit 1 fi # 逐行读取处理 while read -r week month day time year username; do # 拼接时间字符串转换为时间戳,时区和你示例保持为东九区 timestamp=$(date --date="$week $month $day $time $year +0900" +"%s" 2>/dev/null) if [ -n "$timestamp" ]; then echo "$timestamp $username" else echo "格式错误行: $week $month $day $time $year $username" >&2 fi done < "$1"
使用方法
- 赋予执行权限:
chmod +x convert_timeline.sh - 执行转换:
./convert_timeline.sh timeline
方案2:Awk 实现(处理大文件效率更高)
脚本内容(保存为convert_timeline.awk):
#!/usr/bin/awk -f { # 调用date命令转换时间 date_cmd = "date --date=\""$1" "$2" "$3" "$4" "$5" +0900\" +%s 2>/dev/null" date_cmd | getline timestamp close(date_cmd) if (timestamp != "") { print timestamp, $6 } else { print "格式错误行: " $0 > "/dev/stderr" } }
使用方法
- 赋予执行权限:
chmod +x convert_timeline.awk - 执行转换:
./convert_timeline.awk timeline - 也可以直接在终端执行单行命令完成转换:
awk '{cmd="date --date=\""$1" "$2" "$3" "$4" "$5" +0900\" +%s";cmd|getline t;close(cmd);print t,$6}' timeline
常见报错原因说明
- 时间解析失败:检查拼接的时间字符串是否和你测试的格式一致,时区参数是否匹配你原始时间的时区
- Bash循环读行异常:不要使用
for line in $(cat 文件名)的写法,该写法会按空格拆分内容而非按行,必须用while read -r的写法 - Awk运行报错:调用外部
date命令后必须执行close(命令变量),否则处理多行时会出现句柄泄露报错
内容的提问来源于stack exchange,提问作者matiii
相关产品推荐
相关产品推荐

