Script de shell para extrair cadeia de um arquivo e retornar os próximos caracteres até um espaço em branco

1

Temos um aplicativo que captura seus parâmetros de configuração de um arquivo. Eu quero extrair uma ou duas instruções da string de inicialização e apresentá-las como uma boa tabela.

Uma string de exemplo seria -Dmysql.host = mysql1.company.com, mas também pode ser um ipaddress ou um nome de máquina e não um fqdn.

Eu quero localizar o -Dmysql.host = mas retornar o nome do servidor.

Quaisquer dicas ou sugestões de como, uma vez que eu encontrei a string "-Dmysql.host=" no arquivo, mostre tudo para o próximo espaço em branco seria apreciado.

Talvez exista um método melhor. Eu planejo executar isso em uma dúzia de máquinas ou então, eventualmente, retornar uma lista de quais máquinas de aplicativos estão configuradas para conversar com a máquina db em um piscar de olhos.

Obrigado pelo seu tempo.

    
por Nathan Milford 17.06.2009 / 16:10

3 respostas

4

Tente isto:

grep mysql.host file.txt | sed -e 's/.*mysql.host=\(\S*\).*//g'  

Você deve acabar com um valor que é o valor de mysql.host. Você pode colocar o -D no jogo também se você quiser, mas eu o deixei de fora porque é um parâmetro para grep e você precisa escapar dele.

    
por 17.06.2009 / 16:41
1

A partir das informações fornecidas, eu faria isso primeiro dividindo tudo com base no espaço em branco e, em seguida, dividiria esses tokens com base no sinal =. Solução pura bash seria algo como o que se segue.

  foo="bar=baz boo=zip"
  for keyvalue in $foo; do
     key=${keyvalue%%=*} 
     value=${keyvalue##*=}
     echo $key $value
  done

Como o IFS é provavelmente o espaço em branco, o shell cuida da divisão baseada no espaço em branco. Em seguida, você pode usar a Expansão de Parâmetro (Variável) para manipular o spite em pares de chave / valor com base no sinal de igual.

    
por 17.06.2009 / 16:51
0

Que tal alimentar os arquivos para o bom e velho sed:

$ echo foo  -Dmysql.host=mysql1.company.com -bar | grep -- "-Dmysql.host=" | sed -e 's/^.*-Dmysql.host=//' -e 's/ .*//'
mysql1.company.com

Então, no seu caso, você alimentaria o arquivo da seguinte forma:

$ grep -- "-Dmysql.host=" FILENAME | sed -e 's/^.*-Dmysql.host=//' -e 's/ .*//'

Eu percebo que há um grep lá no qual o sed poderia lidar, mas isso é mais fácil de escrever, sed pode ser estranho.

    
por 17.06.2009 / 16:44