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 grep
com 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 grep
comando acima (sem ela, o nome do arquivo só será exibido se houver mais de um arquivo especificado).
Então o grep
comando 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é user
o final do registro os altera para uma string vazia ( ""
).