A partir da sua (pequena) amostra de smartctl
mensagens acima, parece que suas partes são basicamente separadas por "< espaço > < tudo menos uma minúscula >" (exceto pelo campo "# nnn" no início da linha).
sed
poderia ajudar a separar as partes:
$ smartctl_output="\
# 1 Short offline Completed without error 00% 7264 -
# 2 Short offline Completed without error 00% 7240 -
# 1 Short offline Completed: read failure 20% 717 555027747"
$ csv="$( sed 's/ //; s/ \([^[:lower:]]\)/,/g' <<< "$smartctl_output" )"
$ echo "$csv"
#1,Short offline,Completed without error,00%,7264,-
#2,Short offline,Completed without error,00%,7240,-
#1,Short offline,Completed: read failure,20%,717,555027747
Se é isso que você quer, agora você pode preencher sua matriz como fez com o HDDinfo.
[atualização]
Aqui está uma explicação sobre a parte sed
que faz a divisão: o programa sed
é feito de duas partes que eu coloquei em uma linha. Aqui está a versão expandida:
sed '
s/ //
s/ \([^[:lower:]]\)/,/g
'
Um programa sed
opera em cada linha de entrada: lê uma linha, aplica um conjunto de transformações e imprime a linha. Então começa de novo com a próxima linha até que não haja mais linhas para ler.
Aqui, o primeiro sed
command s/ //
exclui o primeiro espaço para unir "#" e o número seguinte.
Em seguida, o segundo sed
command s/ \([^[:lower:]]\)/,/g
pesquisa o início de cada campo (conforme definido por "< espaço > < tudo, menos um > minúsculo") e substitui o espaço por dois pontos. O refere-se à expressão regular entre parênteses "
\([^[:lower:]]\)
", que representa o primeiro caractere do próximo campo.
A parte restante é um teste: em vez de alimentar sed
com o conteúdo de um arquivo ou a saída de um comando, eu o alimentei com a variável smartctl_output
(uma string feita de suas amostras) e eu atribuí o resultará na variável csv
.
[atualização # 2]
Aparece agora que os campos estão separados por dois ou mais espaços. É ainda mais fácil do que anteriormente. O comando sed
torna-se:
sed 's/ \+/,/g'
O que significa: substituir todas as séries de dois ou mais espaços por dois pontos.