Pesquise nos arquivos do Linux, filtre uma string específica e remova todo o resto

Pesquise nos arquivos do Linux, filtre uma string específica e remova todo o resto

Estou tentando encontrar uma maneira eficiente de pesquisar todo um conjunto de arquivos em um diretório e procurar apenas uma string específica até a primeira vírgula.

Exemplo do arquivo de log 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 

Estou interessado apenas no nome de usuário usado nos arquivos. Eu poderia usar o pgbadger e visualizá-lo via HTML, mas consumiria muito tempo.

Então, como exemplo, eu seria capaz de ver apenas:

user=postgres

Ao contrário de todo o conjunto de texto antes e depois do usuário.

No entanto, estou procurando qualquer usuário que não seja especificamente o postgres.

Eu tentei usar grep em arquivos, mas só vejo resultados apenas em user = postgres.

Existe alguma maneira de pesquisar em um conjunto de arquivos, digamos user= até a primeira vírgula, como exemplo?

Ou até mesmo pesquisar todos os arquivos e remover tudo o que estiver antes de user= em cada linha, talvez eu possa colocar no Excel para obter o resultado que preciso.

Qualquer ajuda é muito apreciada.

Responder1

Usar GNU grepcom PCRE:

grep -Po -- '(?<=user=).+?(?=,)' *.log

Se você user=também gosta de exibir a palavra-chave:

grep -o -- 'user=[^,]*' *.log

você pode até exibir o arquivo no qual a correspondência foi bem-sucedida adicionando a -H opção ao grepcomando acima (sem ela, o nome do arquivo só será exibido se houver mais de um arquivo especificado).

Então o grepcomando se torna:

grep -Ho -- 'user=[^,]*' *.log

E a saída:

pgsql.log:user=postgres
pgsql.log:user=postgres

Responder2

Usando awk:

awk '/user=/{gsub(/^.*user=|,.*$/, "");print $0}' file

Se você deseja exibir user=um nome de arquivo, o comando pode ser alterado.

awk '/user=/{gsub(/^.*user=|,.*$/, "");
printf "%s:user=%s\n",FILENAME,$0}' *.log

Neste comando, se user=for encontrado, gsub()a função que pega os caracteres do início do registro user=e segue a vírgula até usero final do registro os altera para uma string vazia ( "").

informação relacionada