Gerando sequências de palavras com delimitadores de espaço a partir da instrução cut

Gerando sequências de palavras com delimitadores de espaço a partir da instrução cut

Eu sou novo no bash. Quando executo o seguinte comando:

grep "type" /root/myFile | cut-d'=' -f2

Eu recebo o seguinte:

102
304
503
442

Quero armazenar o conteúdo do primeiro comando em uma variável de forma que o conteúdo da variável seja equivalente a declará-lo assim:

myVariable="102 304 503 442"

Eu não sei como fazer isso. Eu inicializo myVariablecom uma string vazia e percorro o conteúdo do comando linha por linha e acrescento-o em myVariable com espaços em branco entre ou existe uma maneira mais fácil de fazer isso com o bash?

Responder1

Você pode fazer isso sozinho bash, usando a substituição de comandos e depois a expansão de parâmetros.

Primeiro pegue a saída do comando em uma variável usando substituição de comando $()e, em seguida, use a expansão de parâmetros para substituir todas as novas linhas por espaços ${variable//$'\n'/ }:

$ myVariable=$(grep "type" /root/myFile | cut-d'=' -f2) 
$ myVariable=${myVariable//$'\n'/ }
$ echo $myVariable
102 304 503 442

Mas para reutilização e limpeza, seria melhor usar um array:

myArray=( $(grep "type" /root/myFile | cut-d'=' -f2) )

e itere sobre os elementos da matriz da maneira usual.

Responder2

myVariable=`grep "type" /root/myFile | cut-d'=' -f2`

O que está entre os back-ticks (`) é executado e a saída é atribuída a myVariable.

Se sua saída atual estiver separada por feeds de linha ( \n), você pode querer substituí-los por espaços como tr:

myVariable=`grep "type" /root/myFile | cut-d'=' -f2`|tr '\n' ' '`

Nota: Algumas pessoas preferem usar a $()sintaxe em vez de crases, mas ambos são úteis e quando tenho escolha, uso os crases. A verdadeira vantagem de ter ambos é se você deseja lidar com a execução em dois níveis, uma vez que a expressão marcada com crase será enviada primeiro para um sub-shell e então a $()parte será executada.

informação relacionada