编写awk解析Heroku路由器日志脚本遇语法错误,求排查原因
解决Awk脚本语法错误问题
错误原因
你使用的match()函数三参数形式(将正则捕获组结果存入数组)是GNU awk(gawk)专属特性,如果你的系统默认awk是BSD awk或其他非GNU版本,就会因不支持该语法报错。
解决办法
方法1:改用GNU awk执行
直接将命令中的awk替换为gawk(需确保系统已安装gawk,可通过apt install gawk或brew install gawk安装):
gawk '/coderbyte heroku\/router/ { match($0, /request_id=([^ ]+)/, req); match($0, /fwd="([^"]+)"/, fwd); req_value = req[1]; fwd_value = fwd[1]; if (fwd_value == "MASKED") { print req_value " [M]"; } else { print req_value " [" fwd_value "]"; } }' web-logs-raw
方法2:兼容所有Awk版本的写法
利用match()返回的RSTART和RLENGTH变量,结合substr()提取捕获组内容,这种写法能在所有标准Awk环境下运行:
awk '/coderbyte heroku\/router/ { # 提取request_id的值 if (match($0, /request_id=([^ ]+)/)) { req_value = substr($0, RSTART + 11, RLENGTH - 11); } # 提取fwd的IP值 if (match($0, /fwd="([^"]+)"/)) { fwd_value = substr($0, RSTART + 5, RLENGTH - 5); } if (fwd_value == "MASKED") { print req_value " [M]"; } else { print req_value " [" fwd_value "]"; } }' web-logs-raw
说明:
RSTART是匹配到的字符串起始位置,RLENGTH是匹配长度。减去固定前缀的长度(request_id=是11字符,fwd="是5字符),就能精准提取捕获组的内容。
内容的提问来源于stack exchange,提问作者Godwin
相关产品推荐
相关产品推荐

