如何将awk匹配字段传入shell date命令实现日期格式批量转换
你编写的命令不生效的核心原因是:Shell的命令替换是在awk进程启动前完成的。你通过-v参数给awk传值时,$3还属于未赋值的Shell变量(空值),date命令会默认使用当前系统时间生成结果,相当于所有行共用了同一个固定的时间值,自然和每行提取的日期字段无关。
你需要在awk匹配到pubDate行、成功提取到$3字段后,再动态调用date命令处理该字段值,参考实现如下:
awk -F '[><]' '/<pubDate>/ { # 拼接date命令,传入当前行提取到的日期值 date_cmd = "date -d \"" $3 "\" +\"%a, %d %b %Y %T %z\"" # 执行命令并将返回结果存入变量 date_cmd | getline formatted_date # 关闭进程避免资源占用 close(date_cmd) # 输出替换后的完整pubDate行 print " <pubDate>" formatted_date "</pubDate>" # 跳过当前行后续处理 next } # 非pubDate行直接原封不动输出 1' feed.xml
如果需要直接修改原文件(GNU awk支持),可以加上-i inplace参数:
awk -i inplace -F '[><]' '/<pubDate>/ { date_cmd = "date -d \"" $3 "\" +\"%a, %d %b %Y %T %z\"" date_cmd | getline formatted_date close(date_cmd) print " <pubDate>" formatted_date "</pubDate>" next }1' feed.xml
如果需要固定时区输出(避免受运行命令的系统时区影响),可以在date命令前指定时区变量,比如要固定使用美国中部时间的话,修改date_cmd为:date_cmd = "TZ=America/Chicago date -d \"" $3 "\" +\"%a, %d %b %Y %T %z\""
内容的提问来源于stack exchange,提问作者grokkingnix
相关产品推荐
相关产品推荐

