![如何从 awk 脚本的输出中排除不包含字符串的行?](https://linux22.com/image/65890/%E5%A6%82%E4%BD%95%E4%BB%8E%20awk%20%E8%84%9A%E6%9C%AC%E7%9A%84%E8%BE%93%E5%87%BA%E4%B8%AD%E6%8E%92%E9%99%A4%E4%B8%8D%E5%8C%85%E5%90%AB%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E8%A1%8C%EF%BC%9F.png)
一般来说,对脚本编写完全陌生,并且一直在编写一个脚本来浏览我们的日志,其中包含各种不同事物的条目。我感兴趣的是记录用户活动的条目(我们网站上的登录、点击等)。
我拼凑了以下 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]++
}