我在macOS上,有一个文件,里面有一堆日志和它们的时间戳。时间戳的格式为“秒自纪元”,但我想用"MM-DD-YY HH:MM:SS“的格式来替换它们。例如:
1605726368.416115秒后的时代应该替换为11-18-20 20:06:08。注意,由于Epoch时间戳是十进制值,这就是日志被时间戳的方式。
我试图通过sed和date实现这一点,如下所示:
sed -E -i '' -e "s/^([0-9]+)([0-9.]+)/$(date -r \1 '+%m-%d-%Y %X')/" logfile.txt
问题是,date只将\1解释为1秒,而不是引用regex中的([0-9]+)捕获组。我尝试过很多东西,比如用$1或\\1替换$1或\\1,乱搞单引号和双引号,从自制中安装gnu-sed,并使用/e标志进行尝试,但都没有效果。因此,我的问题基本上是:是否可以在$(.)中使用\N回引用命令替换(特别是在sed替换字符串的上下文中)?
如果可能的话,我希望避免读取while循环中的每一行,并在每一行上调用sed,因为这非常慢。
发布于 2020-11-19 19:28:08
您不能在sed中捕获值的反向引用上执行命令替换,因为命令替换将在此之前运行,它将采用文字\1而不是实际捕获的值。
如果您对perl解决方案很满意,那么这将很好地工作:
perl -pe 's/^[0-9]+\.[0-9]+/{
use POSIX qw( strftime ); strftime("%m-%d-%Y %X", localtime($&));
}/e' file.logPS:如果您的时代值为gmtime,则可以使用GMT而不是localtime。
发布于 2020-11-21 19:10:28
我将从paste的两个糟糕的解决方案开始,这可能会使您感到好笑。
当所有行都以时间戳开头时,可以使用
paste -d " " <(printf '%(%m-%d-%Y %X)T\n' $(cut -d"." -f1 logfile.txt)) \
<(cut -d" " -f2- logfile.txt)对于只有线条标记的行,这将失败,在今后的几年中,您可以使用。
paste -d " " <(printf '%(%m-%d-%Y %X)T\n' $(cut -d"." -f1 logfile.txt)) <(cut -c19- logfile.txt)您可以像以前一样使用sed。首先提取命令,然后进行下一个源。
. <(sed -E 's/^([0-9]+)([0-9.]+)(.*)/printf "%(%m-%d-%Y %X)T" "\1"; echo "\3"/' logfile.txt)我认为awk是最好的:
awk -F "." '{ print strftime("%m-%d-%Y %X",$1) substr($0,17) }' logfile.txthttps://stackoverflow.com/questions/64917624
复制相似问题