Como usar a variável para grep dentro do script Ksh

0
#!/bin/ksh
Temp=Kerala
cs1='grep "$Temp" State_list.txt | awk '{print $NF}''
echo $cs1 #("Not seeing output KL":

Se eu alterar o código da seguinte forma, funciona:

cs1='grep "Kerala" State_list.txt | awk '{print $NF}''

... mas eu gostaria de passar isso como variável.

O arquivo State_List.txt é o seguinte:

Karnataka KAR
TamilNadu TN
Kerala    KL
    
por natrajeee20 21.02.2018 / 14:39

1 resposta

3

O problema foi resolvido na seção de comentários.

Resumo:

Os arquivos, tanto o script quanto possivelmente o arquivo de dados, eram arquivos de texto do DOS. No Unix, isso significa que eles tinham um \r (retorno de carro) supérfluo no final de cada linha.

Para o script, isso significa que a atribuição de variável

Temp=Kerala

atribuiu o valor Kerala\r à variável Temp . Como o arquivo de dados não continha esse valor, nunca foi encontrado.

A execução do script com o valor inserido no lugar da variável funcionou, uma vez que, naquele local nos dados, não foi afetado pelo problema de texto do DOS.

O utilitário dos2unix deve ser instalado e executado nos dois arquivos para garantir que sejam arquivos de texto Unix. Veja também outras questões neste site relacionadas a este utilitário.

O script também poderia ter sido escrito assim:

#!/bin/sh

Temp='Kerala'
cs1=$( awk -v pattern="$Temp" '$1 ~ pattern { print $NF }' State_list.txt )
printf '%s\n' "$cs1"

Isso elimina grep e usa awk em seu lugar para procurar por qualquer linha na primeira coluna do arquivo de dados que contenha pattern (uma variável atribuída a $Temp na linha de comando) . Com == no lugar de ~ , uma correspondência de cadeia exata é executada em vez de uma correspondência de expressão regular.

O script é um script sh , uma vez que (e o original) não usa nenhum recurso ksh especial.

    
por 21.02.2018 / 17:37