使用 awk 打印和编辑日期

使用 awk 打印和编辑日期

我正在寻找一个单行命令来获得我想要的输出。普通文本如下所示:“test_list_20160915_bla.log”所需输出:“2016/09/15”

我可以使用两个 awk 命令来完成此操作(我知道该命令仅打印年份,这只是为了目的):

echo "test_list_20160915_bla.log" |awk -F_ '$3 ~ /[0-9]/ {print $3}' |awk 'BEGIN {OFS="/"} {print substr($1,1,4)}'

但如何在 1 个命令中使用它呢? awk 是正确的工具吗?也许 sed 可以做同样的事情,但我更熟悉 awk。

我对提供的解决方案遇到一些问题。有时我们有这样的文件:“test_20161205145213.log”。使用 sed 命令,我的输出将类似于“2051/45/21”,这非常糟糕。尝试了几件事,但我无法弄清楚。

切换了这个

 sed -r 's!^.*_([0-9]{4})([0-9]{2})([0-9]{2})_.*$!\1/\2/\3!'

 sed -r 's!^.*(20[0-9]{2})([0-9]{2})([0-9]{2}).*$!\1/\2/\3!'

这将错误输出限制为 2 小时的时间戳。我宁愿完全忽略文件名,只查找其中的时间戳。

时间戳可以是 yyymmdd_hhmmss 或 yyymmddhhmmss。我只需要 yyyy/mm/dd 部分。问题是没有固定长度或字段分隔符。

答案1

您可以在同一awk脚本中进行切片和切块:

echo "test_list_20160915_bla.log" |
    awk -F_ '$3 ~ /^[1-9][0-9]*$/ { print substr($3,1,4) "/" substr($3,5,2) "/" substr($3,7,2) }'

在这里,我们只是从第三个“_”分隔的字段中提取年、月、日数字组并将其打印出来。

或者使用sed,它也可以满足您的额外要求:

(
    echo "test_list_20160915_bla.log"
    echo "test_20161205145213.log"
) |
    sed -r 's!^.*_([0-9]{4})([0-9]{2})([0-9]{2}).*$!\1/\2/\3!'

在这里,我们使用正则表达式捕获年、月、日的三个数字组,丢弃其他所有内容,然后将这三个组打印出来,并用 连接起来/

相关内容