使用 sed 将时间戳替换为日期
replacing timestamp with date using sed
当使用 SED 将时间戳替换为人类可读的日期时,时间戳总是替换为纪元日期加上放置在“\”之后的值
我有这个使用 Perl 的例子,但更喜欢使用 sed。我尝试了不同的转义序列并引用 "'` 等
sed -re "s/([0-9]{10})/$(date -d @)/g" mac.txt
输入(一串):
834|task|3||1561834555|Ods|12015|info|Task HMI starting 837|task|3||1561834702|Nailsd|5041|info|Configured with engine 6000.8403 (/opt/NAI/LinuxShield/engine/lib/liblnxfv.so), dats 9297.0000 (/opt/NAI/LinuxShield/engine/dat), 197 extensions, 0 extra drivers
期待日期转换,但结果是:
834|task|3||Wed Dec 31 19:00:01 EST 1969|Ods|12015|info|Task HMI starting 837|task|3||Wed Dec 31 19:00:01 EST 1969|Nailsd|5041|info|Configured with engine 6000.8403 (/opt/NAI/LinuxShield/engine/lib/liblnxfv.so), dats 9297.0000 (/opt/NAI/LinuxShield/engine/dat), 197 extensions, 0 extra drivers 838|task.
基本上:
这就是所谓的:
$(date -d @) instead of $(date -d @61834555)
sed 从未看到 $(date -d @)
-- shell 在 sed 启动之前 执行了该命令替换。
你可以这样:
sed -Ee 's/([0-9]{10})/$(date -d @)/g' -e 's/^/echo "/' -e 's/$/"/' mac.txt | sh
(注意单引号,防止 shell 进行任何扩展)
但是,使用具有日期功能的语言更明智 built-in。 GNU awk:
gawk -F '|' -v OFS='|' '{
for (i=1; i<=NF; i++)
if ($i ~ /^[0-9]{10}$/)
$i = strftime("%c", $i)
print
}' mac.txt
可能会安装 Perl:
perl -MPOSIX=strftime -pe 's{\b(\d{10})\b}{ strftime("%c", localtime ) }ge' mac.txt
# or, this is more precise as it only substitutes *fields* that consist of a timestamp
perl -MPOSIX=strftime -F'\|' -lape '$_ = join "|", map { s/^(\d{10})$/ strftime("%c", localtime ) /ge; $_ } @F' mac.txt
当使用 SED 将时间戳替换为人类可读的日期时,时间戳总是替换为纪元日期加上放置在“\”之后的值
我有这个使用 Perl 的例子,但更喜欢使用 sed。我尝试了不同的转义序列并引用 "'` 等
sed -re "s/([0-9]{10})/$(date -d @)/g" mac.txt
输入(一串):
834|task|3||1561834555|Ods|12015|info|Task HMI starting 837|task|3||1561834702|Nailsd|5041|info|Configured with engine 6000.8403 (/opt/NAI/LinuxShield/engine/lib/liblnxfv.so), dats 9297.0000 (/opt/NAI/LinuxShield/engine/dat), 197 extensions, 0 extra drivers
期待日期转换,但结果是:
834|task|3||Wed Dec 31 19:00:01 EST 1969|Ods|12015|info|Task HMI starting 837|task|3||Wed Dec 31 19:00:01 EST 1969|Nailsd|5041|info|Configured with engine 6000.8403 (/opt/NAI/LinuxShield/engine/lib/liblnxfv.so), dats 9297.0000 (/opt/NAI/LinuxShield/engine/dat), 197 extensions, 0 extra drivers 838|task.
基本上: 这就是所谓的:
$(date -d @) instead of $(date -d @61834555)
sed 从未看到 $(date -d @)
-- shell 在 sed 启动之前 执行了该命令替换。
你可以这样:
sed -Ee 's/([0-9]{10})/$(date -d @)/g' -e 's/^/echo "/' -e 's/$/"/' mac.txt | sh
(注意单引号,防止 shell 进行任何扩展)
但是,使用具有日期功能的语言更明智 built-in。 GNU awk:
gawk -F '|' -v OFS='|' '{
for (i=1; i<=NF; i++)
if ($i ~ /^[0-9]{10}$/)
$i = strftime("%c", $i)
print
}' mac.txt
可能会安装 Perl:
perl -MPOSIX=strftime -pe 's{\b(\d{10})\b}{ strftime("%c", localtime ) }ge' mac.txt
# or, this is more precise as it only substitutes *fields* that consist of a timestamp
perl -MPOSIX=strftime -F'\|' -lape '$_ = join "|", map { s/^(\d{10})$/ strftime("%c", localtime ) /ge; $_ } @F' mac.txt