Você não precisa usar uma matriz. Como os dados de entrada parecem ser muito regulares, eu converteria os dados de entrada em instruções de atribuição de shell, depois os leria no shell e avaliaria. Assim:
#!/bin/sh
sed '
s/^[-0-9]* */date=/
s/,.*thisOne={/ /
s/}.*//
s/,/ /g
' "$@" |
while read line
do
eval $line
echo date=$date
echo id=$id
echo name=$name
echo ip=$ip
echo port=$port
done
O comando sed
converte a linha de entrada para isso:
date=00:12:10 id=1001 name=TestGw ip=192.168.0.1 port=88
O loop while
lê uma dessas linhas por vez e eval $line
faz com que a linha seja executada no shell, o que resulta nas variáveis sendo definidas para os valores fornecidos.
O script processará os nomes dos arquivos a partir da linha de comando OU da entrada padrão (observe o "$@"
no final do comando sed
).
O comando sed
converte a linha em instruções de designação de shell por meio de uma série de comandos s
(substitute):
-
Substitua, apenas no início da linha (
^
), qualquer sequência de traços e dígitos ([-0-9]*
), seguida por um ou mais espaços (*
) comdate=
:s/^[-0-9]* */date=/
-
Substitua uma vírgula seguida por qualquer caractere (
.*
) seguido porthisOne=
com um espaço:s/,.*thisOne={/ /
-
Exclua uma chave de fechamento (
}
) seguida por quaisquer outros caracteres (.*
) para o final (implícito) da linha:s/}.*//
-
Substitua todas as vírgulas (
,
) por espaços:s/,/ /g
No script de exemplo, recomendo que você exclua temporariamente o canal |
no final do arquivo e execute somente a parte do comando sed
do script para que você possa experimentar e ver como ele funciona.