Bash 如何使用AWK打印图案?

Bash 如何使用AWK打印图案?,bash,for-loop,awk,Bash,For Loop,Awk,我需要在文件中找到符合正则表达式模式的word 因此,如果符合要求,我有: 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} 我想知道: register GW_USER=BB GW_CHANNEL=AA 如何打印GW_用户和GW_频道

我需要在文件中找到符合正则表达式模式的word

因此,如果符合要求,我有:

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}   
我想知道:

register GW_USER=BB GW_CHANNEL=AA

如何打印GW_用户和GW_频道列?

您的
如果
条件不合适,您可以使用regex替换:

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

FW_USER
$i
匹配,但将在整行中匹配
GW_频道。

只要输入中有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

这样,您以后就可以在任何其他字段中轻松打印或执行任何其他操作。

您的意思是什么?你不需要那个图案后面的数字吗?在你的例子中,cc来自哪里?我更改了我的问题并添加了示例。00:10:20918 I[AbstractAction.java]-register | 0.0.0 |{GW| u CHANNEL=AA,PWD=*************,ID=77777777,GW_USER=BB,NUM=3996,SYSTEM_USER=OS,LOGIC||ID=0}/GW|u USER{GW| GW|u CHANNEL GW/-或。我不会理解你的任何评论。我建议您编辑您的问题,并提供一个带有预期输出的示例数据。谢谢!这就是我需要的。
awk '{for(i=1;i<=NF;i++){ if($i ~ /GW_USER|GW_CHANNEL/) print $5, $i } }' file
if($i ~ /GW_USER/ && /GW_CHANNEL/)
$ 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