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 awk
loop, se isso for tudo que você precisa.