Busque en archivos de Linux, filtre cadenas específicas y elimine todo lo demás

Busque en archivos de Linux, filtre cadenas específicas y elimine todo lo demás

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 grepcon 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 grepcomando anterior (sin ella, el nombre del archivo solo se muestra si hay más de un archivo especificado).

Entonces el grepcomando 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 userel final del registro los cambia a una cadena vacía ( "").

información relacionada