难以理解 awk 脚本
trouble understanding an awk scrpt
我在理解这个 gawk 命令时遇到问题。总之,它根据特定条件解析两个日志(本地访问)Tomcat 日志文件。
函数如下:
gawk 'function getip(rec) {n=split(rec,a,"\"");
split(a[n-1],ip,",");return ip[1]}
~ /302/ && ~ /POST/ && ~ /^\/sso\/lfe\/ui\/login/
{lfe_user_ip=getip([=10=]);
user_path[lfe_user_ip]=user_path[lfe_user_ip]"_login-302"}
/\/sso\/pfe\/rs\/profile\/customer/ && ~ /PUT/
{pfe_user_ip=getip([=10=]);
if (user_path[pfe_user_ip] ~ /_login-302/) {
if ( ~ /200/) successful_redirect_conversion+=1;
else failed_redirect_conversion+=1;} }
END {print successful_redirect_conversion, failed_redirect_conversion}' \
localhost_kff_access_log.2017-10-09.txt \
/ses/var/late/dev001/tomcat/kfc/s002/logs/localhost_kfc_access_log.2017-10-09.txt
我不明白的是 split
方法以及路径的转义:
~ /^\/sso\/lfe\/ui\/login/
第一个split
在文字双引号上划分输入并将结果放入a
:
n=split(rec,a,"\"");
n
的值表示我们最终得到了多少个字段。下一个 split
取倒数第二个字段并用逗号分隔:
split(a[n-1],ip,",");
最后,函数 returns 这些值中的第一个:
return ip[1]
如果无法访问您的输入日志,很难确切地说它完成了什么,但通常情况下,类似于
various values "some of them in quotes" and "11.22.33.44,55.66.77.88,some more"
将采用最后一个双引号字段(n-1
是因为 split
returns 是最后一个 "
之后的空字段)并进一步删除之后的任何内容第一个逗号,产生最终结果 11.22.33.44
.
关于反斜杠,您必须转义 Awk 正则表达式中的任何文字反斜杠,因为反斜杠本身就是一个正则表达式分隔符。
~ /foo/bar/
是一个语法错误,因为斜线看起来像正则表达式在 foo
之后结束,而 bar/
在外面。放入像 /foo\/bar/
这样的反斜杠允许 Awk 解析器正确地看到内部斜杠是正则表达式的一部分,而不是它的终止分隔符。
我在理解这个 gawk 命令时遇到问题。总之,它根据特定条件解析两个日志(本地访问)Tomcat 日志文件。
函数如下:
gawk 'function getip(rec) {n=split(rec,a,"\"");
split(a[n-1],ip,",");return ip[1]}
~ /302/ && ~ /POST/ && ~ /^\/sso\/lfe\/ui\/login/
{lfe_user_ip=getip([=10=]);
user_path[lfe_user_ip]=user_path[lfe_user_ip]"_login-302"}
/\/sso\/pfe\/rs\/profile\/customer/ && ~ /PUT/
{pfe_user_ip=getip([=10=]);
if (user_path[pfe_user_ip] ~ /_login-302/) {
if ( ~ /200/) successful_redirect_conversion+=1;
else failed_redirect_conversion+=1;} }
END {print successful_redirect_conversion, failed_redirect_conversion}' \
localhost_kff_access_log.2017-10-09.txt \
/ses/var/late/dev001/tomcat/kfc/s002/logs/localhost_kfc_access_log.2017-10-09.txt
我不明白的是 split
方法以及路径的转义:
~ /^\/sso\/lfe\/ui\/login/
第一个split
在文字双引号上划分输入并将结果放入a
:
n=split(rec,a,"\"");
n
的值表示我们最终得到了多少个字段。下一个 split
取倒数第二个字段并用逗号分隔:
split(a[n-1],ip,",");
最后,函数 returns 这些值中的第一个:
return ip[1]
如果无法访问您的输入日志,很难确切地说它完成了什么,但通常情况下,类似于
various values "some of them in quotes" and "11.22.33.44,55.66.77.88,some more"
将采用最后一个双引号字段(n-1
是因为 split
returns 是最后一个 "
之后的空字段)并进一步删除之后的任何内容第一个逗号,产生最终结果 11.22.33.44
.
关于反斜杠,您必须转义 Awk 正则表达式中的任何文字反斜杠,因为反斜杠本身就是一个正则表达式分隔符。
~ /foo/bar/
是一个语法错误,因为斜线看起来像正则表达式在 foo
之后结束,而 bar/
在外面。放入像 /foo\/bar/
这样的反斜杠允许 Awk 解析器正确地看到内部斜杠是正则表达式的一部分,而不是它的终止分隔符。