了解awk scrpt的麻烦

问题描述:

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

下面是函数:

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

由于'/'被用作正则表达式分隔符,它正在转义'/'。 – anubhava

+0

感谢您的及时回复!任何想法user_path变量如何工作。不知道你可以做 – OakvilleWork

+0

拆分,请参阅https://www.gnu.org/software/gawk/manual/gawk.html#index-split_0028_0029-function ....以避免转义'/',你可以使用'$ 7〜'^/sso/lfe/ui/login“' – Sundeep

第一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解析器正确看到内部斜杠是正则表达式的一部分,而不是其终止分隔符。