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

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

Tenho centenas de logs espalhados por alguns milhares de VMs e estou tentando criar alguns scripts para verificar rapidamente os logs e descobri a maior parte da apresentação e queria saber se existe uma maneira fácil de usar algo como awk, printf, etc. que sei usar, mas especificamente para imprimir um intervalo iterado de valores dos arquivos de log?

Exemplo:

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

Eu sei como awk, formatar, separar etc. corretamente a saída impressa, mas pensei que seria bom se eu pudesse especificar um intervalo de campos que gostaria de imprimir.

Atualizarei minha pergunta se descobrir como fazê-lo com as perguntas semelhantes sugeridas e/ou por conta própria.

Obrigado!

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

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

Responder1

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

Pelo menos com o GNU awk, 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 em vez da 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 de fora os dois últimos campos, independentemente de quantos campos precedem esses dois:

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

Outras gamas

Para imprimir começando 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 omitir dinamicamente os 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

Responder2

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

cut -d, -f1-5 huge_log_file.csv

Isso é muito mais simples do que um awkloop, se isso for tudo que você precisa.

informação relacionada