代码之家  ›  专栏  ›  技术社区  ›  OakvilleWork

无法理解awk scrpt[重复]

  •  0
  • OakvilleWork  · 技术社区  · 8 年前

    我在理解这个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 回复  |  直到 8 年前
        1
  •  1
  •   tripleee    8 年前

    第一个 split 将输入除以文字双引号,并将结果放入 a :

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

    的价值 n 表示我们最终得到的字段数。下一个 分裂 取这些字段中倒数第二个字段,并将其拆分为逗号:

    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 是因为 分裂 返回最后一个之后的空字段 " )并进一步删除第一个逗号后的任何内容,得到最终结果 11.22.33.44 .

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

    $7 ~ /foo/bar/
    

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