Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 无法理解awk scrpt_Bash_Shell_Awk_Gawk - Fatal编程技术网

Bash 无法理解awk scrpt

Bash 无法理解awk scrpt,bash,shell,awk,gawk,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=geti

我在理解这个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/

第一个
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
并进一步删除第一个逗号后的任何内容,从而生成最终结果
11.22.33.44

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

$7 ~ /foo/bar/

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

它正在转义
/
,因为
/
用作正则表达式分隔符。感谢您的及时回复!!了解user_path变量的工作原理。不知道您可以对拆分执行此操作,请参阅…为了避免转义
/
,您可以使用
$7~“^/sso/lfe/ui/login”
$7 ~ /foo/bar/