¿Cómo excluir las líneas que no incluyen una cadena del resultado de un script awk?

Completamente nuevo en el scripting en general, y hemos estado trabajando en un script para revisar nuestros loggings que contienen inputs para una variedad de cosas diferentes. Lo que me interesa son las inputs que registran la actividad del usuario (inicios de session, clics, etc. en nuestro sitio).

He reconstruido el siguiente script awk (con muchísima ayuda) que casi funciona perfectamente, excepto que imprime resultados para líneas que no contienen un nombre de usuario. Me gustaría excluirlos, y no he podido averiguar cómo hacerlo (supongo que es algo simple).

Aquí está el código:

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 

Simplemente no estoy seguro de cómo excluir todas las líneas que no contienen nombre de usuario de la salida.

Aquí hay una muestra de una línea que contiene un nombre de usuario:

 qtp111659197-5776 - 05-26@09:37:34:240 INFO (TimingInfoProxy.java:41) - com.mycompany.api.ApiHandler-0>getUniqueDataBySource(data,{"has_values":false,"last_event_triggenetworking":"","user_info":{"username":"joe@mycompany.com","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":[]}},) 

Y aquí hay un breve ejemplo de una línea que no:

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

Como ya estás conectado a otros commands de shell, solo usaré grep.

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

(Tenga en count que estoy usando -f porque la label de nombre de usuario nunca varía).

Editar: esa es la forma más obvia. Una manera posiblemente "mejor" sería usar awk en sí mismo, por ejemplo

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

Tu código no está verificando el resultado de la match . Lo siguiente lo arregla.

RSTART se establece invocando la function de coincidencia. Su valor es la position de la cadena donde comienza la subcadena coincidente, o cero si no se encontró coincidencia.

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