É possível imprimir um intervalo de argumentos iterados via cli de um csv? (consultar exemplo)

4

Eu tenho centenas de logs espalhados por alguns milhares de VMs e estou tentando criar alguns scripts para varrer rapidamente os logs e descobri a maioria da apresentação e queria saber se há uma maneira fácil de usar algo como awk, printf, etc, que eu sei usar, mas especificamente para imprimir um intervalo de valores iterados dos arquivos de log?

Exemplo:

awk -F, '{printf $(1..5)}' huge_log_file.csv
column1 column2 column3 column4 column5
etc.

Eu sei como fazer o awk, formatar, separar, etc, a saída impressa, mas achei que seria legal se eu pudesse especificar um intervalo de campos que gostaria que fosse impresso.

Vou atualizar minha pergunta se descobrir como fazer isso com as perguntas sugeridas e / ou por conta própria.

Obrigado!

EDIT: Eu sei como imprimir $ 1 $ 2 $ 3 manualmente, mas não incluí-lo no meu exemplo

EDIT 2: Também estou ciente de como contar o número de campos com awk usando NF para tornar o intervalo dinâmico mais tarde, que é meu objetivo de longo prazo.

    
por Spear 13.06.2016 / 23:20

2 respostas

2

Intervalos que começam com o primeiro campo

Vamos considerar este arquivo de teste:

$ cat input.csv
a,b,c,d,e,f,g,h,i,j

Com o GNU awk, pelo menos, podemos imprimir os primeiros cinco (ou outro número) de campos como este:

$ awk -F, '{NF=5; print}' OFS=, input.csv
a,b,c,d,e

Para aqueles que valorizam a concisão com mais clareza, poderíamos escrever de forma equivalente:

$ awk -F, '{NF=5;} 1' OFS=, input.csv
a,b,c,d,e

Redimensionamento dinâmico

Para deixar os dois últimos campos, independentemente de quantos campos precederem esses dois:

$ awk -F, '{NF-=2; print}' OFS=, input.csv
a,b,c,d,e,f,g,h

Outros intervalos

Para imprimir iniciando e parando com campos arbitrários, é necessário um loop:

$ awk -v first=3 -v last=6 -F, '{for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f

Para imprimir a partir do terceiro campo e sair dinamicamente dos dois últimos campos:

$ awk -v first=3 -F, '{last=NF-2; for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f,g,h
    
por 13.06.2016 / 23:24
2

Apenas um ponto rápido; awk é muito mais flexível, mas se tudo que você quer é um intervalo específico de campos, use cut :

cut -d, -f1-5 huge_log_file.csv

Isso é muito mais simples do que um loop awk se isso é tudo que você precisa.

    
por 14.06.2016 / 01:04