Usando sed
Por conveniência, vamos colocar nossa saída find na variável s
:
$ s='/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";'
Agora, vamos extrair as partes que você deseja:
$ echo "$s" | sed -E 's|/([^/]*/){4}([^/.]*)[.][^"]*(.*)| |'
user "xxxxxxx";
Como funciona
O script sed consiste em um único comando substituto. O -E
flag é usado para ativar expressões regulares estendidas.
-
A linha é comparada com:
/([^/]*/){4}([^/.]*)[.][^"]*(.*)
/([^/]*/){4}
corresponde aos primeiros quatro diretórios. Por causa dos parentes, o último desses diretórios é salvo como grupo 1, mas não teremos uso para isso.([^/.]*)
corresponde ao nome de usuário sem a extensão. Por causa dos parênteses, esse agrupamento é salvo como grupo 2.[.][^"]*
corresponde à extensão e tudo até a primeira aspa dupla.(.*)
corresponde a tudo, começando com a primeira aspa dupla até o final da linha. Novamente, por causa dos parênteses, isso é salvo como grupo 3. -
O texto de substituição é
Usando o awk
$ echo "$s" | awk -v FS="/" '{ name=$6; sub(/[.].*/,"", name); sub(/[^"]*/, ""); print name, $0;}'
user "xxxxxxx";
Como funciona
-
-v FS="/"
Isso define o separador de campo como
/
. -
name=$6; sub(/[.].*/,"", name)
Como o awk conta campos, o nome está no sexto campo. Salvamos o sexto campo na variável
name
e, em seguida, removemos tudo emname
após o primeiro período. -
sub(/[^"]*/, "")
Isso remove tudo, desde a linha até, mas não inclui, o primeiro
"
. -
print name, $0
Isso imprime o nome, um separador de campo (o padrão é um espaço) e o que resta da linha após a substituição (a senha).