如何从 awk 脚本的输出中排除不包含字符串的行?

如何从 awk 脚本的输出中排除不包含字符串的行?

一般来说,对脚本编写完全陌生,并且一直在编写一个脚本来浏览我们的日志,其中包含各种不同事物的条目。我感兴趣的是记录用户活动的条目(我们网站上的登录、点击等)。

我拼凑了以下 awk 脚本(带有大量帮助),它几乎可以完美运行,除了它打印不包含用户名的行的输出。我想排除它们,但无法找到如何做到这一点(我认为这很简单)。

这是代码:

awk '
{       split($3, d, "@")
        match($0, /"username":"[^"]*"/)
        user = substr($0, RSTART + 12, RLENGTH - 13)
        c[d[1] OFS user]++
}
END {   for(i in c)
                printf("%4d %s\n", c[i], i)
}' mycompany.log | sort -k3,3 -k2,2

我只是不确定如何从输出中排除所有不包含用户名的行。

以下是包含用户名的行的示例:

qtp111659197-5776 - 05-26@09:37:34:240 INFO  (TimingInfoProxy.java:41)     - com.mycompany.api.ApiHandler-0>getUniqueDataBySource(data,{"has_values":false,"last_event_triggered":"","user_info":{"username":"[email protected]","orgid":"69d467a7-9786-47e1-9c12-bb40f9bfc65d","ip":"127.0.0.1"},"date_range":{"min_date":"","start_date":"","end_date":"","trending_start_date":"","trending_end_date":""},"terms":{"and_filtering":[]}},) 

这是一个没有的行的简短示例:

main - 05-22@10:05:21:387 INFO  (ContextLoader.java:313)     - Root WebApplicationContext: initialization completed in 9519 ms

答案1

由于您已经通过管道连接到其他 shell 命令,因此我只使用 grep。

awk '
{
...
}' mycompany.log | grep -f '"username:"' | sort -k3,3 -k2,2

(请注意,我使用 -f 是因为用户名标签永远不会改变。)

编辑:这是最明显的方式。可以说“更好”的方法是使用 awk 本身,例如

awk '
/\"username\":/ {
...
}' mycompany.log | sort -k3,3 -k2,2

答案2

您的代码没有检查match.下面修复它。

RSTART 通过调用匹配函数来设置。它的值是匹配子字符串开始的字符串位置,如果没有找到匹配则为零。

if(RSTART){
   user = substr($0, RSTART + 12, RLENGTH - 13)
   c[d[1] OFS user]++
}

相关内容