我正在尝试在字符串中转换纪元时间,替换时间字符串,但保持字符串的其余部分保持原样。我已经设法弄清楚,但由于FS分隔符正则表达式,我使用了我丢失了先前格式的a = string [space] b = string [space]
通常列出文件:
cat file
输出:
h=10.130.14.28 u="sometext" s=111 X=- t=1386748760 T=132641284 Ts=123 act=1 cat="0x0000000000"
使用下面的awk字符串我已经转换了纪元时间,但我想保留以前的格式。
cat file | awk 'BEGIN {FS= "[\= ]"} {$10="\""strftime("%I:%M:%S%p %Z %m-%d-%G",$10)"\""} {print}'
输出 - 在a = string [space]中丢失等号字符b = string [space]格式
h 10.130.14.28 u "sometext" s 111 X - t "11:59:20PM PST 12-10-2013" T 132641284 Ts 123 act 1 cat "0x0000000000"
我想我可能需要使用OFS和awk或者管道来进行sed,但不太确定如何做到这一点。当我使用{ OFS "=" }
时,它只是在每个字段分隔符中添加一个= - 所以我接近但不完全是我需要的。
cat file | awk 'BEGIN {FS= "[\= ]"} {OFS= "="} {$10="\""strftime("%I:%M:%S%p %Z %m-%d-%G",$10)"\""} {print}'
输出:
h=10.130.14.28=u="sometext"=s=111=X=-=t="11:59:20PM PST 12-10-2013"=T=132641284=Ts=123=act=1=cat="0x0000000000"
我的最终目标是拖尾日志输出这些字符串并动态转换纪元时间。
答案 0 :(得分:3)
您可以尝试:
awk '
{
match($0, /t=([^[:blank:]]*)[[:blank:]]/, a)
ss= "t=\""strftime("%I:%M:%S%p %Z %m-%d-%G",a[1])"\" "
sub(/t=[^[:blank:]]*[[:blank:]]/,ss)
print
}' file
说明:
$0
是整行。我们不需要指定任何字段分隔符,因为我们处理整行而不是特定字段。 /t=([^[:blank:]]*)[[:blank:]]/
搜索字符串“t =”,后跟一组非空格。由于我们在其周围有括号,即:([^[:blank:]]*)
,我们稍后可以将该部分称为a[1]
。