我有这样的文件,名为 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
/ :strftime
Time::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 3
→09 3
→0903
s/^\(..\)\(..\)\( ........\) \(....\)./\4-\1-\2\3/
将剩余的日期/时间字符串从 转换mmdd HH:MM:SS YYYY]
为YYYY-mm-dd HH:MM:SS
。 (如果您希望输出中出现前导空格,如您的问题所示,请将它们添加到此命令中。)
笔记:
- 这不进行错误处理。如果输入不是你所说的那样,输出将会被扰乱。
- 这会用英语对月份名称进行硬编码,并且不适应区域设置。