如何使用AWK打印图案?

时间:2015-02-14 18:13:37

标签: bash for-loop 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 $5 " " $i} } }'

仅打印:

 register GW_USER=BB

我想知道:

register GW_USER=BB GW_CHANNEL=AA

如何打印GW_USER和GW_CHANNEL列?

2 个答案:

答案 0 :(得分:2)

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

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

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

你的情况:

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

FW_USER$i匹配,但会在整行中与GW_CHANNEL匹配。

答案 1 :(得分:0)

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

$ cat tst.awk
match($0,/{[^}]+/) {
    str = substr($0,RSTART+1,RLENGTH-1)
    split(str,arr,/[ ,=]+/)
    delete n2v
    for (i=1; i in arr; i+=2) {
        n2v[arr[i]] = arr[i+1]
    }
    print $5, 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

这样你将来可以轻松打印或做任何其他任何领域。