了解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/
答
第一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解析器正确看到内部斜杠是正则表达式的一部分,而不是其终止分隔符。
由于'/'被用作正则表达式分隔符,它正在转义'/'。 – anubhava
感谢您的及时回复!任何想法user_path变量如何工作。不知道你可以做 – OakvilleWork
拆分,请参阅https://www.gnu.org/software/gawk/manual/gawk.html#index-split_0028_0029-function ....以避免转义'/',你可以使用'$ 7〜'^/sso/lfe/ui/login“' – Sundeep