【问题标题】:convert dateformat in awk, line contains 2 dates and one ip在 awk 中转换日期格式,行包含 2 个日期和 1 个 ip
【发布时间】:2014-03-27 11:54:32
【问题描述】:

我有以下行:

192.168.1.200§Feb 24 10:22:14 2014 GMT§Aug 24 10:22:14 2014 GMT

我想用 awk(或其他东西)将它转换成这一行:

2014-02-24 2014-02-24 192.168.1.200

我能够使用 awk 转换 ONE Date,使用以下命令:

awk 'BEGIN { FS="§"} {cmd1="date \"+%Y-%m-%d\" -d \""$2"\""; cmd1 | getline var;  print var}'

但我不知道如何在一个命令中转换行?

【问题讨论】:

    标签: bash shell awk


    【解决方案1】:

    试试这个:

    BEGIN {
        FS="§"
    }
    
    {
        cmd1="date \"+%Y-%m-%d\" -d \""$2"\""
        cmd1 | getline var1
        cmd2="date \"+%Y-%m-%d\" -d \""$3"\""
        cmd2 | getline var2
        print var1, var2, $1
    }
    

    用法:

    $ cat in.txt
    192.168.1.200§Feb 24 10:22:14 2014 GMT§Aug 24 10:22:14 2014 GMT
    $  awk -f conv.awk < in.txt
    2014-02-24 2014-08-24 192.168.1.200
    

    【讨论】:

      【解决方案2】:

      这是awk的一种方式:

      awk -v FS="§" '
      BEGIN {
          split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", month, / /)
          for (i=1; i<=12; i++) { mm[month[i]] = sprintf("%02d",i) }
      }
      {
          split($2, d1, /[ :]/);
          split($3, d2, /[ :]/); 
          print d1[6]"-"mm[d1[1]]"-"d1[2], d2[6]"-"mm[d2[1]]"-"d2[2], $1
      }' file
      2014-02-24 2014-08-24 192.168.1.200
      
      • 您在BEGIN 语句中为所有月份创建查找表。
      • space: 上的第二个和第三个字段拆分为一个数组。
      • 根据需要格式化和打印。

      【讨论】:

      • 是的,这是怎么做的... +1。
      • 感谢@EdMorton .. 意味着从大师本人那里获得了很多支持! :)
      猜你喜欢
      • 1970-01-01
      • 2020-09-19
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2015-10-19
      • 1970-01-01
      • 2016-04-11
      相关资源
      最近更新 更多