Processe a saída 'find' para analisar certos campos

2

Eu encontrei a saída da seguinte forma:

/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";

Neste exemplo, "user" e o valor de "Password" ("xxxxxxx";) precisam ser redirecionados para um novo arquivo. o "usuário" sempre estará no 5º diretório. No entanto, eu não quero a extensão .rstd. Minha nova saída de arquivo deve ficar assim

user   "xxxxxxxx";

Como posso realizar melhor isso?

    
por user53029 31.08.2016 / 06:14

3 respostas

4

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 é , o que significa que o grupo 2 é seguido por um espaço seguido pelo grupo 3.

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 em name 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).

por 31.08.2016 / 07:22
2

Você pode fazer isso usando sed grouping,

$ echo '/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";' | \
sed 's,\(^/var.*stores/\)\(user\)\(.rstd.*= \)\(.*\),  ,'
user  "xxxxxxx";

Eu sei que parece estranho;) alternativamente você pode usar um muito mais simples

sed -e 's,/var/data/run/stores/,,;s,\..*=,,'
    
por 31.08.2016 / 07:22
2

Um longo ... mas parece funcionar

$ echo '/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";'  | \
awk -F/ ' { print $6 $7} ' | awk -F"." ' { print $1, " ", $3 } ' | \
awk ' { print $1 " " $NF } '
user "xxxxxxx";
    
por 31.08.2016 / 07:07