更改文件的日期格式

更改文件的日期格式

我有这样的文件,名为 Sample.txt:

[Sat Sep 10 06:31:41 2016]!Node2!Node1!Node3
[Sun Sep 11 23:31:41 2016]!Node2!Node1!Node3

我需要修改它,使它看起来像。我需要将日期格式更改为这种格式

  2016-09-10 06:31:41!ER_DEV!Node2!Node1!Node3
  2016-09-11 23:31:41!ER_DEV!Node2!Node1!Node3

答案1

awk在以下人员的帮助下使用date

awk -F '[[\\]]' '{cmd="date -d \""$2"\" \"+%F %T\""; cmd | getline out; print out $3}'
  • -F '[[\\]]'将字段分隔符设置为[],因此日期将位于字段 2 中,其余部分位于字段 3 中

  • 变量cmd包含date将第二个字段转换为所需形式的命令,getline运行外部date命令并将输出保存在变量中out

  • out最后打印变量的内容和第三个字段

例子:

% cat file.txt
[Sat Sep 10 06:31:41 2016]!Node2!Node1!Node3
[Sun Sep 11 23:31:41 2016]!Node2!Node1!Node3

% awk -F '[[\\]]' '{cmd="date -d \""$2"\" \"+%F %T\""; cmd | getline out; print out $3}' file.txt
2016-09-10 06:31:41!Node2!Node1!Node3
2016-09-11 23:31:41!Node2!Node1!Node3

答案2

使用perl 模块中的strptime/ :strftimeTime::Piece

perl -MTime::Piece -pe '
  s/\[(.*?)\]/Time::Piece->strptime($1, "%a %b %d %H:%M:%S %Y")->strftime("%Y-%m-%d %H:%M:%S!ER_DEV")/e
' Sample.txt
2016-09-10 06:31:41!ER_DEV!Node2!Node1!Node3
2016-09-11 23:31:41!ER_DEV!Node2!Node1!Node3

答案3

您可以使用以下强力纯sed命令来完成此操作:

sed 's/^.... //
     s/^Jan /01/; s/^Feb /02/; s/^Mar /03/; s/^Apr /04/; s/^May /05/; s/^Jun /06/
     s/^Jul /07/; s/^Aug /08/; s/^Sep /09/; s/^Oct /10/; s/^Nov /11/; s/^Dec /12/
     s/^\(..\) /\10/; s/^\(..\)\(..\)\( ........\) \(....\)./\4-\1-\2\3/'
  • s/^.... //去掉 the[ 和 the (the 的三个字母缩写)星期几。
  • s/^Jan /01/等,将月份(名称的三个字母缩写)(以及后面的空格)替换为相应的数值(月份编号)。
  • s/^\(..\) /\10/检查一位数的日期(月份中的某一天)值(即小于 10 并带有前导空格的数字)并将其更改为具有前导零。例如,
      [Sat Sep 309 30903
  • s/^\(..\)\(..\)\( ........\) \(....\)./\4-\1-\2\3/ 将剩余的日期/时间字符串从 转换mmdd HH:MM:SS YYYY]YYYY-mm-dd HH:MM:SS。 (如果您希望输出中出现前导空格,如您的问题所示,请将它们添加到此命令中。)

笔记:

  • 这不进行错误处理。如果输入不是你所说的那样,输出将会被扰乱。
  • 这会用英语对月份名称进行硬编码,并且不适应区域设置。

相关内容