我需要找到匹配正则表达式模式的文件字。
所以,如果符合要求,我有:
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列?
答案 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
这样你将来可以轻松打印或做任何其他任何领域。