Usando sed para limpar caminhos longos em arquivos de log

3

Um script gera arquivos de log com dezenas de kilolines e a maioria das linhas é muito longa. Seria ótimo fazer este registro ser amigável com algumas edições.

No tempo de execução, há variáveis de ambiente úteis. Diga, ${X} corresponde a /usr/projects/draco/vendors/spack.tt.developmental/spack.tt.2017-12-06.with-flags/opt/spack/cray-CNL-haswell/intel-17.0.4/gsl-2.4-zagfxq3p5iorh7viw4gc24bwzlx2tyk7

Meu objetivo é usar as variáveis de ambiente para encontrar linhas como

Leaving directory /usr/projects/draco/vendors/spack.tt.developmental/spack.tt.2017-12-06.with-flags/opt/spack/cray-CNL-haswell/intel-17.0.4/gsl-2.4-zagfxq3p5iorh7viw4gc24bwzlx2tyk7

e suplante-os com um espaço reservado conveniente, aqui gsl-install

Leaving directory gsl-install

Meus esforços incluem uma sintaxe malsucedida como essa

sed -i -e 's/${X}/gsl-install/g' tedious.log

Como posso fornecer sed uma variável de ambiente e ter as sequências correspondentes substituídas?

$ uname -a
Darwin ***.***.*** 16.7.0 Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64 x86_64
    
por dantopa 07.12.2017 / 01:31

2 respostas

3

Você tem dois problemas

  • sua variável de ambiente contém caracteres '/'
  • você está contendo seu argumento sed entre aspas simples, então $ {X} é passado não-substituído

Você pode usar qualquer caractere como um delimitador de comando sed . Escolha algo que provavelmente não está na sua string de pesquisa. E use aspas duplas em torno do comando sed ..
Por exemplo:

sed -i -e "s;${X};gsl-install;g" tedious.log
    
por 07.12.2017 / 02:00
1

Para usar variáveis bash em um script sed, você precisa sair da aspa simples, adicionar a variável entre aspas duplas e voltar para a aspas simples para sed.

Exemplo abaixo:

DAY1=$(date -d "+1days" +%m%d%Y)
DAY2=$(date -d "+2days" +%m%d%Y)
DAY3=$(date -d "+3days" +%m%d%Y)
sed -n -E -e '/\s\s\s*'"($DAY1|$DAY2|$DAY3)"'/p' $file
#or
sed -n -E -e ';\s\s\s*'"($DAY1|$DAY2|$DAY3)"';p' $file
    
por 07.12.2017 / 01:44