如何使用 AWK 打印图案?

How to print a pattern using AWK?

我需要在文件中找到匹配正则表达式模式的单词。

所以如果排队,我有:

00:10:20,918  I [AbstractAction.java] - register | 0.0.0.0 | {GW_CHANNEL=AA, PWD=********, ID=777777, GW_USER=BB, NUM=3996, SYSTEM_USER=OS, LOGIC_ID=0}   
 awk -F' ' '{for(i=1;i<=NF;i++){ if($i ~ /GW_USER/ && /GW_CHANNEL/){print  " " $i} } }'

仅打印:

 register GW_USER=BB

我会得到:

register GW_USER=BB GW_CHANNEL=AA

如何打印 GW_USER 和 GW_CHANNEL 列?

您的 if 条件看起来不正确,您可以使用正则表达式替换:

awk '{for(i=1;i<=NF;i++){ if($i ~ /GW_USER|GW_CHANNEL/) print , $i } }' file

不需要在打印中使用 -F" "" ",因为这是默认的字段分隔符。

您的情况:

if($i ~ /GW_USER/ && /GW_CHANNEL/)

将匹配 FW_USER$i 但将匹配整行的 GW_CHANNEL

每当输入中有名称=值对时,最好创建一个将名称映射到值的数组,然后按名称打印:

$ cat tst.awk
match([=10=],/{[^}]+/) {
    str = substr([=10=],RSTART+1,RLENGTH-1)
    split(str,arr,/[ ,=]+/)
    delete n2v
    for (i=1; i in arr; i+=2) {
        n2v[arr[i]] = arr[i+1]
    }
    print , fmt("GW_USER"), fmt("GW_CHANNEL")
}
function fmt(name) { return (name "=" n2v[name]) }
$
$ awk -f tst.awk file
register GW_USER=BB GW_CHANNEL=AA

这样你以后就可以轻松地打印或在任何其他字段上做任何你想做的事情。