Estoy tratando de encontrar una forma eficiente de buscar en un conjunto completo de archivos en un directorio y solo buscar una cadena específica hasta la primera coma.
Ejemplo del archivo de registro de Postgres:
Apr 27 03:35:18 test postgres[24098]: [5-1] user=postgres,db=postgres,app=psqlclient=127.0.0.1
Apr 27 03:35:18 test postgres[24098]: [5-2] user=postgres,db=postgres,app=psqlclient=127.0.0.1
Sólo me interesa el nombre de usuario utilizado en los archivos. Podría usar pgbadger y verlo a través de HTML, pero llevaría bastante tiempo.
Entonces, como ejemplo, podría ver solo:
user=postgres
A diferencia de todo el conjunto de texto antes y después del usuario.
Sin embargo, estoy buscando cualquier usuario que no sea específicamente postgres.
Intenté usar grep en archivos pero solo veo resultados en usuario = postgres.
¿Existe alguna forma de buscar en un conjunto de archivos, por ejemplo, usuario = hasta la primera coma como ejemplo?
O incluso buscar en cada archivo y eliminar todo lo que esté antes de usuario= en cada fila, luego podría ponerlo en Excel para obtener el resultado que necesito.
Cualquier ayuda es muy apreciada.
Respuesta1
Usar GNU grep
con PCRE
:
grep -Po -- '(?<=user=).+?(?=,)' *.log
Si desea mostrar la user=
palabra clave también:
grep -o -- 'user=[^,]*' *.log
incluso puede mostrar el archivo en el que la coincidencia se realizó correctamente agregando la -H
opción al grep
comando anterior (sin ella, el nombre del archivo solo se muestra si hay más de un archivo especificado).
Entonces el grep
comando se convierte en:
grep -Ho -- 'user=[^,]*' *.log
Y la salida:
pgsql.log:user=postgres
pgsql.log:user=postgres
Respuesta2
Usando awk
:
awk '/user=/{gsub(/^.*user=|,.*$/, "");print $0}' file
Si desea mostrar user=
un nombre de archivo, entonces se puede cambiar el comando.
awk '/user=/{gsub(/^.*user=|,.*$/, "");
printf "%s:user=%s\n",FILENAME,$0}' *.log
En este comando, si user=
se encuentra,
gsub()
la función que toma los caracteres desde el inicio del registro user=
y sigue la coma hasta user
el final del registro los cambia a una cadena vacía ( ""
).