Estou solicitando uma lista de instantâneos ec2 por meio da ferramenta de linha de comando ec2 da amazon:
ec2-describe-snapshots -H --hide-tags > snapshots.csv
Os dados são mais ou menos assim:
SnapshotId VolumeId StartTime OwnerId VolumeSize Description
snap-00b66464 vol-b99a38d0 2012-01-05 5098939 160 my backup
Como posso interceptar os dados antes de redirecioná-los para snapshots.csv
e fazer o seguinte:
- substituir "guias" por vírgulas
- encapsular valores com cotações
- se um valor é todos os números, prefixe-o com um
=
para que o Excel o trate como texto - por exemplo,OwnerId
deve ser"=5098939
"(este não é necessário se não puder ser feito em linha e exigiria um arquivo ou função de script)
saída desejada:
"SnapshotId","VolumeId","StartTime","OwnerId","VolumeSize","Description"
"snap-00b66464","vol-b99a38d0","2012-01-05","=5098939","=160","my backup"
Respostas:
Supondo que você nomeie isso
convert.awk
, você pode ligar comou (após adicionar permissões de execução
chmod a+x convert.awk
)Isso criará uma nova coluna para cada guia, que manterá a coluna de comentários (a menos que contenha guias), mas adicione colunas vazias (embora seja a aparência da saída de amostra, talvez você realmente queira isso). Se você deseja dividir em todos os espaços em branco (isso reduzirá as guias extras na tabela, mas colocará cada palavra na descrição como uma nova coluna), retire a
FS="\t";
instrução.Para as gerações futuras, se você não precisar dos
"
s ou=
s ou espaços em branco incorporado, você pode torná-lo um one-liner:fonte
./convert.sh
chmod + xe canalize a entrada para que ele imprima a saída? Estou recebendo um erro:/usr/bin/awk: syntax error at source line 1 context is >>> . <<< /convert.sh
.convert.awk
que seja umawk
script e nãobash
um. Atualizei a postagem com a linha de comando completa e notei que adicionei um-f
sinalizador que havia esquecido à primeira linha (que diz para ele interpretar o arquivo como comandos).Aqui está uma solução perl. Isso pode ser possível com o sed / awk, mas o teste da parte numérica provavelmente a tornaria muito feia.
fonte
Se você é apenas preguiçoso como eu e quer fazer tudo em uma linha de comando sem escrever um script, eis como eu faria isso.
O
^I
é feito pressionando ctrl+ v i.O primeiro
sed
troca todo otabs
for","
. O segundosed
insere a"
no início de cada linha e o último sed insere um fechamento"
no final de cada linha.fonte
<kbd>text</kbd>
.sed -e 's/^I/","/g' -e 's/.*/"&"/'
ou ainda mais curtased -e 's/^I/","/g;s/.*/"&"/'
.Outra solução Perl:
invocar com
ec2-describe-snapshots -H --hide-tags | /var/tmp/script.pl > output.txt
fonte
sed é o utilitário linux mais útil que eu já encontrei.
O primeiro comando substitui todas as guias em cada linha por vírgulas e aspas. O segundo comando insere aspas no início e no final de cada linha, de modo que cada valor fique entre aspas, o que permite que vírgulas façam parte do valor.
fonte
Isso pode funcionar para você:
fonte