【问题标题】:awk multiline problemawk 多行问题
【发布时间】:2011-08-01 00:27:07
【问题描述】:

一直在尝试编写一个处理日志文件的 awk 脚本,但正在苦苦挣扎。

我有一个文件,其中的行如下所示:

[2011-07-29 04:44:37.100 INFO] AU/SUB1/Server:WebHits : Hits[ABC]=0; Hits[DEF]=876; Hits[THY]=0; Hits[SG]=891; Hits[XFRR]=1386
[2011-07-29 04:44:37.599 INFO] AU/SUB2/Server:WebHits : Hits[XARR]=0; Hits[XXX]=0; Hits[ABS]=0; Hits[SM]=0
[2011-07-29 04:44:37.699 INFO] AU/MAIN/Server:Main : Hits=254
[2011-07-29 04:44:38.100 INFO] AU/SUB1/Server:WebHits : Hits[ABC]=0; Hits[DEF]=1134; Hits[THY]=0; Hits[SG]=1153; Hits[XFRR]=426
[2011-07-29 04:44:38.599 INFO] AU/SUB2/Server:WebHits : Hits[XARR]=0; Hits[XXX]=0; Hits[ABS]=0; Hits[SM]=22
[2011-07-29 04:44:38.699 INFO] AU/MAIN/Server:Main : Hits=436

如您所见,每秒有 3 行(每秒总是有 3 行)。我想合并这些行(每秒一行),以便摘要看起来像这样,因此将一行摘要相关器与输入日志文件中的三行:

[2011-07-29 04:44:37 INFO] MainHits=254,ABC=0,DEF=876,THY=0,SG=891,XFRR=1386,XARR=0,XXX=0,ABS=0,SM=0
[2011-07-29 04:44:38 INFO] MainHits=436,ABC=0,DEF=1134,THY=0,SG=1153,XFRR=426,XARR=0,XXX=0,ABS=0,SM=22

请注意场地名称,例如“ABC,DEF,THY,SG 等”可以动态变化。

任何帮助将不胜感激。

【问题讨论】:

  • 每秒会有 3 条记录总是?或者有时会滑到 1 或 2,或者可能是 4,5?您可以将其定义为任何时候第二个值更改,您想要所有当前标签的活动记录输出吗? (从那一秒开始)。祝你好运!
  • 你好避难所。已更新问题。是的,每秒总会有 3 个。我希望每秒查看一条摘要行,无论数据是否已更新。
  • 您写了“无论数据是否已更新,每秒汇总行数。”那是一个完全不同的问题。如果您将此数据加载到数据库中,那么在那里生成空记录会容易得多。祝你好运。

标签: bash awk


【解决方案1】:

解决方案在很大程度上依赖于您发布的输入格式:

awk '/Main :/ {
  sub(/\.[0-9]*/, x, $2)
  print $1, $2, $3, "Main" $NF, r
  r = x; next
  }
{
  gsub(/Hits\[/, x)
  gsub(/[];]/, x)
  for (i = 5; ++i <= NF;)
    r = r ? r "," $i : $i
  }' infile 

【讨论】:

    【解决方案2】:

    使用 sed 的神秘解决方案:

    sed -e 'N;N;s/\n\[.\{28\}\]/;/g;s/\.... INFO/ INFO/;s!AU/SUB1/Server:WebHits : !!;s!AU/SUB2/Server:WebHits : !!;s!AU/MAIN/Server:Main : !!;s/ INFO\] \(.*\) Hits=\(.*\)/ INFO\] MainHits=\2 \1/;s/ Hits\[\([^]]*\)\]=\([^;]*\);/,\1=\2/g' infile
    

    这值得一些解释,所以下面是一个注释的脚本文件版本。它必须使用'sed -f script infile' 运行

    # Read 2 more lines, so we will have 3 lines are in the pattern space.
    N
    N
    # Change the timestamps of the 2 extra lines by a ;.
    s/\n\[.\{28\}\]/;/g
    # Remove the milliseconds of the remaining timestamp, and the extra data of each line.
    s/\.... INFO/ INFO/
    s!AU/SUB1/Server:WebHits : !!
    s!AU/SUB2/Server:WebHits : !!
    s!AU/MAIN/Server:Main : !!
    # Generate the MainHits data.
    s/ INFO\] \(.*\) Hits=\(.*\)/ INFO\] MainHits=\2 \1/
    # Format the Hits data.
    s/ Hits\[\([^]]*\)\]=\([^;]*\);/,\1=\2/g
    

    【讨论】:

      猜你喜欢
      • 2019-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多