如何使用 awk 从 grep 打印选定的列

How to print selected columns from grep using awk

我有以下输入,

[2014-12-22 10:39:54,668] - 1=1,2=2,3=A,4=1,109=5313F,110=Y,112=20141222-15:40:21.056,150=D,180=C,167=CS

各行的字段顺序可能不同。

目标是获取特定字段,例如日期、时间、109、110、150、167 等

2014-12-22,10:39:54,668,109=5313F,110=Y,150=D,167=CS.

困难在于不同行的字段顺序可能不同,关于实现此目的的简单 awk 脚本的任何建议还是 perl/python 更适合?

这可能会:

awk -F"[][, ]" '{a=","",";for (i=5;i<=NF;i++) if($i~/^1(09|10|50|67)=/) a=a","$i;print a}' file
2014-12-22,10:39:54,668,109=5313F,110=Y,150=D,167=CS

Awk 支持 associative arrays。这可以帮助您克服字段排序问题,如下所示:

echo "[2014-12-22 10:39:54,668] - 1=1,2=2,3=A,4=1,109=5313F,110=Y,112=20141222-15:40:21.056,150=D,180=C,167=CS" |
  awk -F'[, \[\]]' '{ 
    for (i=7; i++ < NF;)
    {
      split($i,parts,"=");
      h[parts[1]]=parts[2]
    }

    printf "%s,%s,%s,109=%s,110=%s,150=%s,167=%s\n ", 
      , , , 
      h["109"], 
      h["110"], 
      h["150"], 
      h["167"] 

    }'

每当您的输入中有 name=value 对时,最好创建一个 name2value 数组然后使用它:

$ cat tst.awk
BEGIN { FS="[][ ,=]"; OFS="," }
{
    for (i=7; i<=NF; i+=2) {
       name2value[$i] = $(i+1)
    }
    print , , , fmt(109), fmt(110), fmt(150), fmt(167)
}
function fmt(name) { return (name "=" name2value[name]) }

$ awk -f tst.awk file
2014-12-22,10:39:54,668,109=5313F,110=Y,150=D,167=CS