【问题标题】:Rebuild string after awk with equals and space alternating field seperators在 awk 之后使用等号和空格交替字段分隔符重建字符串
【发布时间】:2014-01-02 03:32:16
【问题描述】:

我正在尝试将纪元时间转换为字符串,替换时间字符串,但保持字符串的其余部分不变。我已经设法弄清楚了,但是由于我使用了 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"

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

【问题讨论】:

    标签: bash time awk converter epoch


    【解决方案1】:

    你可以试试:

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

    【讨论】:

    • 这很好用!你能解释一下解决方案吗?我很想知道这一切是如何运作的。
    • 感谢您的解决方案和添加的描述!
    猜你喜欢
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多