Como extrair dados de um arquivo e construir um nome de arquivo a partir de um dos valores

3

Estou tentando extrair dois valores de um arquivo de configuração e gravá-los em um novo arquivo. A parte difícil é que eu quero que o nome do novo arquivo seja determinado por um dos valores no arquivo de entrada.

Os valores que estou tentando extrair são "Build_Version" e o acrônimo de quatro letras do nome do Docker ("docker_Name"). Por exemplo, se o arquivo disser docker_Name='bcbs_pr-app-01' , quero apenas o "bcbs". E quero gravá-los em um arquivo com o nome da compilação, como bcbs_build.txt .

Aqui está um trecho do arquivo de log:

nonSSL_port=80  # FOR STAGING 
Build_Type=prod 
Build_Version=9.0.00.01_134143 
docker_Name='bcbs-pr-app-01'

A saída do arquivo desejado é

bcbs
9.0.00.01_134143 

Eu criei um comando sed que funcionou para extrair os valores que eu queria

sed -n -e '/Build_Version=/p' -e '/docker_Name=/p' environment-info.conf > build_version.txt

mas isso extrai as linhas Build_Version= e docker_Name= em sua totalidade e quero apenas os valores do nome Build_Version e do docker. E ainda preciso descobrir como nomear o arquivo com o acrônimo de nome de quatro letras Docker (bcbs).

    
por Truth Seeker 07.03.2016 / 16:41

5 respostas

1

Esse arquivo se parece com a sintaxe sh . Portanto, se esse arquivo for de fato um arquivo de configuração destinado a ser originado em sh scripts, faça o seguinte:

. ./environment-info.conf &&
  printf '%s\n' "${docker_Name%%-*}" "$Build_Version" > "${docker_Name%%-*}_build.txt"
    
por 07.03.2016 / 17:46
1

1) alternando seu sed para a) remover as primeiras aspas simples de docker_Name , b) remover -pr-app-01' (incluindo a última aspa simples), c) remover a <value>= part:

 sed -n "/Build_Version=/s/.*=//p;/docker_Name=/s/.*=//;s/'//;s/-.*//p"

Em que /match/s/pattern/replacement/ substitui pattern por replacement em uma linha match . Se replacement for uma string vazia, ela será efetivamente removida. Observe que mudei de aspas simples para aspas duplas para manipular aspas simples em sua string e que você pode usar curingas * . para corresponder a sequências mais complexas e combinar comandos sed com ponto e vírgula.

2) Lemos nos dois resultados como uma matriz BASH :

values=( $( sed -n "/Build_Version=/s/.*=//p;/docker_Name=/s/.*=//;s/'//;s/-.*//p" file ) )

Onde array=( value1 value2 value3 ) e $(do this command)

3) Usamos o array para nossos propósitos, observe que o contador começa em 0 :

echo ${values[1]} > ${values[1]}
echo ${values[0]} >> ${values[1]}

Onde endereçamos uma entrada de uma matriz através do nome da matriz e o intex da entrada ${array[intex]} .

    
por 07.03.2016 / 17:09
0

Você precisa usar sed para isso? grep e perl podem fazer o que você precisa.

grep 'Build_Type\|docker_Name' environment-info.conf | perl -pe "s|docker_Name='(.*?)-.*|docker_Name=|" > build_version.txt
    
por 07.03.2016 / 17:24
0

Usando o GNU sed :

sed -nr "s/^Build_Version=([^=]+)$//p; s/^docker_Name='([^-]+).*//p" file.txt

Estamos usando grupos de captura para obter as partes desejadas das linhas relevantes. Tem duas partes:

  • s/^Build_Version=([^=]+)$// nos obtém 9.0.00.01_134143

  • s/^docker_Name='([^-]+).*// nos obtém bcbs

Para salvar a saída em build_version.txt :

sed -nr "s/^Build_Version=([^=]+)$//p; s/^docker_Name='([^-]+).*//p" \
        file.txt >build_version.txt

Exemplo:

% cat file.txt 
nonSSL_port=80  # FOR STAGING 
Build_Type=prod 
Build_Version=9.0.00.01_134143 
docker_Name='bcbs-pr-app-01'

% sed -nr "s/^Build_Version=([^=]+)$//p; s/^docker_Name='([^-]+).*//p" file.txt
9.0.00.01_134143 
bcbs
    
por 07.03.2016 / 17:25
0

Você está procurando uma maneira de nomear o arquivo com quatro letras do nome do docker. Isso pode ser obtido pelo comando abaixo, que atribuirá as quatro letras a uma variável chamada File_Name.

File_Name='cat file | grep "docker_Name" | awk -F"'" '{print $2}' | awk -F'-' '{print $1}''

Como mencionado acima, o comando abaixo atribuirá o docker_Name e build_version a um array chamado values:

values=($(sed -n "/docker_Name=/s/.*=//;s/'//;s/-.*//p;/Build_Version=/s/.*=//p" file))

Estamos acessando a matriz na ordem inversa para capturar a saída da maneira que você deseja:

for i in 1 0; do echo ${values[$i]} >> $File_Name.txt; done

O arquivo estará pronto com o nome que você quiser e o gato exibirá seu conteúdo:

% cat bcbs.txt
bcbs
9.0.00.01_134143
    
por 07.03.2016 / 17:50