Eu tenho um arquivo que inclui detalhes sobre VMs em execução em um hipervisor. Executamos algum comando e redirecionamos a saída para um arquivo. E os dados estão disponíveis no formato abaixo.
Virtual Machine : OL6U5
ID : 0004fb00000600003da8ce6948c441bb
Status : Running
Memory : 65536
Uptime : 17835 Minutes
Server : MyOVS1.vmorld.com
Pool : HA-POOL
HA Mode: false
VCPU : 16
Type : Xen PVM
OS : Oracle Linux 6
Virtual Machine : OL6U6
ID : 0004fb00000600003da8ce6948c441bc
Status : Running
Memory : 65536
Uptime : 17565 Minutes
Server : MyOVS2.vmorld.com
Pool : NON-HA-POOL
HA Mode: false
VCPU : 16
Type : Xen PVM
OS : Oracle Linux 6
Virtual Machine : OL6U7
ID : 0004fb00000600003da8ce6948c441bd
Status : Running
Memory : 65536
Uptime : 17835 Minutes
Server : MyOVS1.vmorld.com
Pool : HA-POOL
HA Mode: false
VCPU : 16
Type : Xen PVM
OS : Oracle Linux 6
Essa saída difere de hypervisor para hypervisor, pois em alguns hipervisores temos 50 + vms em execução. O arquivo acima é apenas um exemplo do hypervisor, onde temos apenas 3 VMs em execução e, portanto, o arquivo redirecionado deve conter informações sobre várias (N número de VMs)
Precisamos obter esses detalhes no formato abaixo usando awk / sed ou com um script de shell
Virtual_Machine ID Status Memory Uptime Server Pool HA VCPU Type OS
OL6U5 0004fb00000600003da8ce6948c441bb Running 65536 17835 MyOVS1.vmworld.com HA-POOL false 16 Xen PVM Oracle Linux 6
OL6U6 0004fb00000600003da8ce6948c441bc Running 65536 17565 MyOVS2.vmworld.com NON-HA-POOL false 16 Xen PVM Oracle Linux 6
OL6U5 0004fb00000600003da8ce6948c441bd Running 65536 17835 MyOVS1.vmworld.com HA-POOL false 16 Xen PVM Oracle Linux 6
text-processing
sed
awk
IgniteLX
fonte
fonte
Respostas:
Se andar o arquivo duas vezes não for um problema (grande) (armazenará apenas uma linha na memória):
Qual, para uma contagem geral de campos, seria (o que poderia ter várias etapas do arquivo):
Mas, para uma transposição realmente geral, isso funcionará:
E para torná-lo bonito (usando tab
\t
como separador de campo):O código acima para uma transposição geral armazenará toda a matriz na memória.
Isso pode ser um problema para arquivos realmente grandes.
Atualização para novo texto.
Para processar o novo texto postado na pergunta, parece-me que duas passagens de awk são a melhor resposta. Uma passagem, tão curta quanto os campos, imprimirá os títulos dos campos do cabeçalho. A próxima passagem do awk imprimirá apenas o campo 2. Nos dois casos, adicionei uma maneira de remover espaços iniciais e finais (para melhor formatação).
O ambiente
{ ... } | column -t -s "$(printf '%b' '\t')"
é formatar a tabela inteira de uma maneira bonita.Observe que ele
"$(printf '%b' '\t')"
pode ser substituído por$'\t'
ksh, bash ou zsh.fonte
Se você tiver o
rs
utilitário (remodelar) disponível, faça o seguinte:Isso fornece o formato de saída exatamente como especificado na pergunta, até as larguras dinâmicas da coluna.
-T
Transpõe os dados de entrada-z
dimensiona as colunas adequadamente do máximo em cada coluna-c:
usa dois pontos como o separador de campos de entradaIsso funciona para tabelas de tamanho arbitrário, por exemplo:
rs
está disponível por padrão no OS X (e provavelmente em outras máquinas BSD). Pode ser instalado no Ubuntu (e na família debian) com:fonte
EDIT: Extensível para qualquer número de linhas de saída, em um
for
loop simples de uma linha :Resposta original:
Você pode fazer isso como uma linha única usando a
bash
substituição do processo:A
-s
opção parapaste
lidar com cada arquivo, um de cada vez. O:
delimitador definidopaste
é "capturado" pela-s
opçãocolumn
no final, para aprimorar o formato, alinhando os campos.Os
cut
comandos nas duas substituições de processo extraem o primeiro campo e o segundo campo, respectivamente.Se há ou não linhas em branco na entrada, não importa, pois
column -t -s:
a saída será limpa independentemente. (Havia linhas em branco na entrada original especificada na pergunta, mas elas foram removidas. O comando acima funciona independentemente das linhas em branco.)Entrada - conteúdo do arquivo chamado "entrada" no comando acima:
Resultado:
fonte
Usando o awk, armazene a chave e o valor e imprima-os no final.
A apenas correr
awk -f ./script.awk ./input.txt
fonte
fonte
Com
gnu datamash
ecolumn
deutil-linux
:Isso funciona com mais de duas colunas, mas assume que não há linhas vazias no seu arquivo de entrada; com linhas vazias no meio (como em sua amostra de entrada inicial), você receberá um erro como:
para evitar que você precise apertá-los antes de processar com
datamash
:Caso contrário, neste caso específico (apenas duas colunas), com
zsh
e o mesmocolumn
:(${(f)"$(<infile)"})
lê as linhas em uma matriz;${(j;:;)list[@]%:*}
junta (com:
) o primeiro campo de cada elemento e${(j;:;)list[@]#*:}
junta (novamente com:
) o segundo campo de cada elemento; ambos são impressos, por exemplo, a saída éque é então canalizado para
column -t -s:
fonte
cat <(head -n 11 virtual.txt | cut -d: -f1) <(sed 's/.*: //' virtual.txt) | xargs -d '\n' -n 11 | column -t
O número de linhas por máquina virtual é codificado nesse caso - 11. Será melhor contá-lo com antecedência e armazenar na variável, depois use essa variável no código.
Explicação
cat <(command 1) <(command 2)
-<()
construção faz com que acommand
saída pareça um arquivo temporário. Portanto,cat
concatena dois arquivos e os canaliza ainda mais.head -n 11 virtual.txt | cut -d: -f1
, dá-nos cabeçalhos das colunas futuras. A única entrada de Máquina Virtual são as primeiras onze linhas, ohead
comando é usado para obtê-la. Ocut
divide esta entrada em duas colunas e imprime a única primeira.sed 's/.*: //' virtual.txt
- nos fornece valores futuros da coluna.sed
remove todo o texto desnecessário e deixa apenas valores.xargs -d '\n' -n 11
. Cada item de entrada é finalizado por nova linha. Este comando obtém itens e os imprime 11 por linha.column -t
- é necessário para telas bonitas de impressão. Ele exibe nossas linhas em forma de tabela. Caso contrário, cada linha terá largura diferente.Resultado
fonte
Use
datamash
e suatranspose
opção para trocar linhas e colunas em um arquivo.Por padrão, a transposição verifica se a entrada tem o mesmo número de campos em cada linha e falha com um erro caso contrário, e você pode desativar seu modo estrito para permitir valores ausentes por
--no-strict
Além disso, você pode usar
--filler
para definir o valor do preenchimento do campo ausente:derivado de
datamash manual
fonte
se seus dados estiverem em arquivos separados em um diretório, você poderá usar:
pode ser necessário massagear o número de
\t
caracteres (tab) naprintf
linha se os valores das variáveis tiverem comprimentos diferentes.fonte