gawk中的正则表达式匹配多种方式
我有一些文本需要拆分以提取相关参数,而我的 [g]awk match 命令不起作用 - 我只是想了解为什么?!(我现在已经写了一个不太优雅的方法......)。
所以字符串是 blahblah|msgcontent1=HeaderUUIiewConsenFlagPSMessage|msgtype2=Blah002|msgcontent2=header
我只想输出 msgcontent1= 的内容,也是
echo "blahblah|msgcontent1=HeaderUUIiewConsenFlagPSMessage|msgtype2=Blah002|msgcontent2=header" | gawk '{ if (match($0,/msgcontent1=(.*)[|]/,a)) { print a[1]; } }'
麻烦而不是得到
HeaderUUIiewConsenFlagPSMessage
我得到了从那里到字符串的最后一个管道的所有内容的匹配HeaderUUIiewConsenFlagPSMessage|msgtype2=Blah002
现在我接受这是因为 regexp/msgcontent1=(.*)[|]/可以匹配多种方式,但是我如何让它按照我想要的方式匹配?
回答
使用您显示的样本,请尝试以下操作。在 GNU 中编写和测试,awk这将只打印从第一次出现msgcontent1=到|第一次出现的内容。
awk 'match($0,/msgcontent1=[^|]*/){print substr($0,RSTART+12,RLENGTH-12)}' Input_file
或echo+awk尝试:
echo "blahblah|msgcontent1=HeaderUUIiewConsenFlagPSMessage|msgtype2=Blah002|msgcontent2=header" |
awk 'match($0,/msgcontent1=[^|]*/){print substr($0,RSTART+12,RLENGTH-12)}'
FPAT在 GNU 中有选项awk:
awk -v FPAT='msgcontent1=[^|]*' '{sub(/.*=/,"",$1);print $1}' Input_file
回答
这是您的输入:
s='blahblah|msgcontent1=HeaderUUIiewConsenFlagPSMessage|msgtype2=Blah002|msgcontent2=header'
您可以gnu awk像这样使用以下方法提取值msgcontent1=:
awk -F= -v RS='|' '$1 == "msgcontent1" {print $2}' <<< "$s"
HeaderUUIiewConsenFlagPSMessage
或使用这个sed:
sed -E 's/^(.*|)?msgcontent1=([^|]+).*/2/' <<< "$s"
HeaderUUIiewConsenFlagPSMessage
或者使用这个gnu grep:
grep -oP '(^||)msgcontent1=K[^|]+' <<< "$s"
HeaderUUIiewConsenFlagPSMessage