Variável Bash no script Awk

2

Eu tenho este banco de dados de arquivo simples (ff_servers.db) com o seguinte conteúdo:

192.168.154.2 Alaska   hp
192.168.157.3 Colorado dell
192.168.156.3 hawaii   hp

Da linha de comando, pude executar:

awk "BEGIN{IGNORECASE=1;}/alaska/ {print $NF}" ff_servers.db'

e eu pegaria

hp

No entanto, de um script bash, estou tendo problemas com "$ NF" Aqui está o despejo desse script:

machine_type='awk "BEGIN{IGNORECASE=1;}/${server_name}/ {print \$NF}" ff_servers.db'
awk "BEGIN{IGNORECASE=1;}/${server_name}/ {print $NF}" ff_servers.db
++ awk 'BEGIN{IGNORECASE=1;}/colorado/ {print }' ff_servers.db
+ target_arch='192.168.157.3   Colorado           dell'

Então, obviamente, $ NF não está sendo traduzido corretamente. Onde estou fazendo errado?

    
por icasimpan 27.12.2012 / 08:29

1 resposta

3

O Bash expande as variáveis (como identificadores que começam com $ ) entre aspas duplas " .

Embora isso também devesse ter sido um problema ao fazer isso interativamente a partir da linha de comando. O Bash tentará expandir "$NF" , se a variável NF não estiver definida, o bash expandirá isso para a sequência vazia.

Geralmente, você pode usar aspas simples em ' para que $NF não seja expandido por bash.

No entanto, como você deseja que ${server_name} expanda, tente tentar escapar em dobro

machine_type='awk "BEGIN{IGNORECASE=1;}/${server_name}/ {print \$NF}" ff_servers.db'

Você também pode tentar usar a concatenação de strings, a diferença é principalmente estilística.

machine_type='awk 'BEGIN{IGNORECASE=1;}/'${server_name}'/{print $NF}' ff_servers.db'

Isso funciona como o bash irá concatenar as strings adjacentes juntas.

    
por 27.12.2012 / 08:37