使用equals和space交替字段分隔符在awk之后重建字符串

时间:2013-12-14 10:34:24

标签: bash time awk converter epoch

我正在尝试在字符串中转换纪元时间,替换时间字符串,但保持字符串的其余部分保持原样。我已经设法弄清楚,但由于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"

我的最终目标是拖尾日志输出这些字符串并动态转换纪元时间。

1 个答案:

答案 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]
  • 然后我们格式化时间字符串。
  • 我们将其替换回整行
  • 我们打印线