麻烦理解awk scrpt

时间:2017-10-11 07:24:33

标签: bash shell awk gawk

我在理解这个gawk命令时遇到了问题。总之,它会根据特定条件解析两个日志(本地访问)Tomcat日志文件。

这是功能:

gawk 'function getip(rec) {n=split(rec,a,"\"");
        split(a[n-1],ip,",");return ip[1]}
    $10 ~ /302/ && $6 ~ /POST/ && $7 ~ /^\/sso\/lfe\/ui\/login/
    {lfe_user_ip=getip($0);
        user_path[lfe_user_ip]=user_path[lfe_user_ip]"_login-302"}
    /\/sso\/pfe\/rs\/profile\/customer/ && $6 ~ /PUT/
    {pfe_user_ip=getip($0);
        if (user_path[pfe_user_ip] ~ /_login-302/) {
            if ($10 ~ /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方法以及路径的逃避:

$7 ~ /^\/sso\/lfe\/ui\/login/

1 个答案:

答案 0 :(得分:1)

第一个split将输入分为文字双引号,并将结果放入a

n=split(rec,a,"\"");

n的值表示我们最终获得了多少字段。下一个split获取这些字段中的倒数第二个并将其拆分为逗号:

split(a[n-1],ip,",");

最后,函数返回第一个值:

return ip[1]

如果无法访问您的输入日志,很难说完全这是什么,但通常会像

那样
various values "some of them in quotes"  and "11.22.33.44,55.66.77.88,some more"

将采用最后一个双引号字段(n-1是因为split从最后一个"之后返回一个空字段,并进一步删除第一个逗号之后的任何内容,从而产生最终结果11.22.33.44

关于反斜杠,你必须转义Awk正则表达式中的任何文字反斜杠,因为反斜杠本身是一个正则表达式分隔符。

$7 ~ /foo/bar/

是一个语法错误,因为斜杠看起来像foo之后的正则表达式结束而bar/在外面。使用像/foo\/bar/这样的反斜杠允许Awk解析器正确地看到内部斜杠是正则表达式的一部分,而不是它的终止分隔符。