Estoy tratando de obtener coincidencias de un archivo de registro con varias cadenas y un comodín. Así es como se ve el registro
prueba.log
abc|07Jan2016:sessionId=F4DF <<random log lines>> def|08Jan2016:sessionId=5415 <<random log lines>> abc|08Jan2016:sessionId=F4DF <<random log lines>> xyz|09Jan2016:sessionId=F3D2 <<random log lines>> ijk|06Jan2016:sessionId=CF38el resultado que espero
abc|07Jan2016:sessionId=F4DF ijk|06Jan2016:sessionId=CF38Como puede ver, solo quiero obtener las líneas de registro que tienen ID de sesión de las líneas que tienen la cadena que coincide con 'abc' y 'ijk'
El comando grep que probé
grep -m 1 'abc.*sessionId\|ijk.*sessionId' test.logel resultado que estoy obteniendo
ijk|06Jan2016:sessionId=CF38El grep no está buscando coincidencias con la cadena 'abc', pero está buscando la coincidencia 'ijk' con el comodín '.*sessionId'. ¿Puede alguien decirme qué me estoy perdiendo aquí?
Este awk puede resolver el problema:
awk 'BEGIN {FS="\\|"; pat["abc"]; pat["ijk"]} $1 in pat && /:sessionId=/ {print; delete pat[$1]}' file.log abc|07Jan2016:sessionId=F4DF ijk|06Jan2016:sessionId=CF38Con sus muestras mostradas, intente seguir el código awk . Esto saldrá del programa una vez que se imprima una de las primeras ocurrencias de cada cadena, por lo que no leerá el archivo de entrada completo.
awk -F'|' ' ($1=="abc" || $1=="xyz") && ++arr[$1]==1{ count++ print } count==2{ exit } ' Input_fileExplicación: agregando una explicación detallada para el código anterior.
awk -F'|' ' ##Starting awk program from here and setting field separator as | here. ($1=="abc" || $1=="xyz") && ++arr[$1]==1{ ##Checking condition if 1st field is abc OR xyz AND their respective index in array arr is ONLY 1. count++ ##Increase count with 1 here. print ##Printing current line here. } count==2{ exit } ##Checking condition if count is 2 then exit from program. ' Input_file ##Mentioning Input_file name here.Sugerencia con grep :
grep -E "^(abc|ijk)\|" file.log Sugiriendo con awk :
awk '/^(abc|ijk)\|/1' file.log